【问题标题】:Show NSPopover from NSTokenField Token on Click单击时显示来自 NSTokenField 令牌的 NSPopover
【发布时间】:2012-04-23 21:45:23
【问题描述】:

我试图在单击令牌时显示来自NSTokenField 令牌的NSPopover

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

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

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

假设- tokenField:menuForRepresentedObject:是一个token被点击时执行代码的唯一方式,我还有一个问题:获取代表token的NSRect,这样NSPopover就可以和说保持视觉关系令牌。我尝试过一些字符串杂耍,弄清楚令牌是如何出现的等等,但它远非可靠,甚至需要一个未记录的方法。

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

【问题讨论】:

    标签: objective-c macos cocoa nstokenfield nspopover


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这就是我最终要做的。我正在开发一个内置此功能的开源 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)。

      【讨论】:

        【解决方案3】:

        另一种选择是使用 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,并且它连接到一个自定义视图,其中包含您想要在弹出框中的所有内容。您可以使用代表对象绑定到笔尖中的值。

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

        【讨论】:

        • 这很好,除非您打算使用 NSPopupButton,因为它不起作用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-13
        • 1970-01-01
        • 1970-01-01
        • 2015-08-16
        • 2019-03-20
        相关资源
        最近更新 更多