当单击令牌时,我试图显示来自NSTokenField令牌的NSTokenField。
这些标记具有显示菜单的内置方式,因此从设计的角度来看,它与此操作没有什么不同。
但是,在单击令牌时,似乎没有执行任意代码的任何(好的)方法。
我已经成功地将一些代码插入到- tokenField:menuForRepresentedObject:中,但它远非优雅。
假设- tokenField:menuForRepresentedObject:是单击令牌时执行代码的唯一方法,那么我还有另一个问题:获取表示令牌的NSRect,以便NSPopover能够与所述令牌保持可视化关系。我尝试过做一些字符串杂耍,弄清楚令牌是如何最先出现的,但是它还远远不可靠,甚至需要一个没有文档的方法。
底线:如何在NSTokenField中显示所选令牌中的NSPopover
发布于 2012-04-24 00:37:43
这就是我最后要做的。我正在开发一个开源的NSTokenField替代方案,它内置了这个功能。
// in an NSWindowController
- (NSMenu *)tokenField:(NSTokenField *)tokenField menuForRepresentedObject:(id)representedObject
{
NSRect displayRect = NSMakeRect(([NSEvent mouseLocation].x - 2.5),
([NSEvent mouseLocation].y - 2.5),
5, 5);
displayRect = [self.window convertRectFromScreen: displayRect];
// establish popover from displayRect ...
}它看上去很棒,尽管感觉非常受攻击(并且被精确地关闭了1 1px )。
发布于 2012-04-24 00:20:02
我认为这是不可能的(见我的努力here)。问题是,单个令牌不会以这样的方式公开,您可以引用它的边界以便将其与弹出器连接起来。
发布于 2014-01-06 06:04:48
另一种选择是使用NSMenuItem支持任意视图的能力:
- (NSMenu *)tokenField:(NSTokenField *)tokenField menuForRepresentedObject:(id)representedObject {
NSMenu *menu = [[NSMenu alloc] init];
NSMenuItem *item = [NSMenuItem alloc] init];
[item setRepresentedObject: representedObject];
NSNib *nib = [[NSNib alloc] initWithNibNamed: @"token" bundle: nil];
[nib instantiateWithOwner: item topLevelObjects: nil];
[menu addItem: item];
return menu;
}然后,您可以创建一个用户界面,其中文件所有者是一个NSMenuItem,它连接到一个自定义视图,其中包含您在Popover中想要的所有内容。可以使用representedObject绑定到nib中的值。
我现在还在做这个的早期阶段。我还没有将我的NSManagedObjects连接到令牌字段,我只是使用一个字符串数组进行测试,但是这样做确实会产生类似Popover的效果,除了小的角指针。看起来比我在研究这件事时看到的其他黑客要好得多,也要简单得多。
https://stackoverflow.com/questions/10288781
复制相似问题