我在点击令牌时尝试从NSPopover
令牌中显示NSTokenField
。
这些令牌具有显示菜单的内置方式,因此从设计的角度来看,它与该操作没有什么不同。
但是,单击一个标记时,似乎没有任何(好的)方法来执行任意代码。
我已经设法将一些代码放入- tokenField:menuForRepresentedObject:
,但它远非优雅。
假设- tokenField:menuForRepresentedObject:
是单击令牌时执行代码的唯一方法,我还有另一个问题:获取代表令牌的NSRect
,以便NSPopover
可以与所述令牌保持视觉关系。我试图做一些字符串杂耍,弄清楚令牌是如何排在第一位等等,但它远非可靠,甚至需要一种无证的方法。
底线:如何在NSPopover
中显示所选令牌中的NSTokenField
?
答案 0 :(得分:1)
我认为无法做到(见我的努力here)。问题是单个令牌不会以这样的方式公开,你可以引用它的边界以便用弹出窗口连接它。
答案 1 :(得分:1)
这就是我最终要做的事情。我正在开发具有此功能的开源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次)。
答案 2 :(得分:0)
另一种选择是使用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中想要的所有内容。您可以使用representObject绑定到nib中的值。
我正处于这样做的最初阶段。我还没有将我的NSManagedObjects连接到令牌字段,我只是使用字符串数组进行测试,但这样做会获得类似Popover的效果,除了小角点指针。看起来比我研究过的其他许多黑客更好,更简单。