0

单击令牌时,我试图NSPopover从令牌中显示一个。NSTokenField

这些令牌具有显示菜单的内置方式,因此从设计的角度来看,它与该操作没有什么不同。

但是,单击令牌时似乎没有任何(好的)方法来执行任意代码。

已经设法将一些代码滑入- tokenField:menuForRepresentedObject:,但它远非优雅。

假设这- tokenField:menuForRepresentedObject:是单击标记时执行代码的唯一方法,我还有另一个问题:获取NSRect表示标记的 ,以便NSPopover可以与所述标记保持视觉关系。我试图做一些字符串杂耍,弄清楚令牌是如何出现的,等等,但它远非可靠,甚至需要一个未记录的方法。

底线:如何在 中显示NSPopover来自所选标记的NSTokenField

4

3 回答 3

1

我认为这是不可能的(请参阅我的努力。问题是单个令牌没有以您可以引用其边界以便将其与弹出框挂钩的方式公开。

于 2012-04-24T00:20:02.977 回答
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 ...
}

看起来非常棒,尽管感觉很受黑客攻击(并且偶尔会被 1px 关闭)。

于 2012-04-24T00:37:43.990 回答
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 中想要的所有内容。您可以使用代表对象绑定到笔尖中的值。

我正处于这样做的早期阶段。我还没有将我的 NSManagedObjects 连接到令牌字段,而且我只是使用字符串数组进行测试,但是这样做确实会得到类似 Popover 的效果,除了小角指针。似乎比我在研究这个时看到的许多其他黑客更好和更简单。

于 2014-01-06T06:04:48.040 回答