在点击时显示来自NSTokenField Token的NSPopover

时间:2012-04-23 21:45:24

标签: objective-c macos cocoa nstokenfield nspopover

我在点击令牌时尝试从NSPopover令牌中显示NSTokenField

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

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

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

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

底线:如何在NSPopover中显示所选令牌中的NSTokenField

3 个答案:

答案 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的效果,除了小角点指针。看起来比我研究过的其他许多黑客更好,更简单。