4

使用时NSTokenField发生了一些奇怪的事情,如下图所示:

当我键入A时,会显示来自弹出窗口的选择。

当我输入 A

我滚动它

在此处输入图像描述

再滚动一些,它就到了可见区域的下方。

在此处输入图像描述

这是所有表格视图的行为。行后面的视图是可见的,但它会自动弹到正常位置。但在这种情况下不是。

邮件应用程序中很好,它工作正常。

我的实现是:

  1. 创建了一个NSTokenField.

  2. 将其委托设置为 AppDelegate。

  3. 在实现文件中

     -(NSArray *)tokenField:(NSTokenField *)tokenField completionsForSubstring:(NSString *)substring indexOfToken:(NSInteger)tokenIndex indexOfSelectedItem:(NSInteger *)selectedIndex{
        return @[@"A",@"B",@"C"];
    }
    

甚至苹果文档中的示例代码也表现不正确。

如何通过某些代码使其自动弹出或限制?

4

2 回答 2

0

您在 Mail.app 中看到的并不是真正的 NSMenu(Apple 作弊,令人震惊!)。原来,它实际上是一个自定义的 NSTextField,链接到一个卡在透明窗口中的 NSTableView。

F 脚本 FTW

这是一个相当古老的技巧来绕过 NSMenu 的极差版本scrollWheel:恰好已经实现。 MTTokenField是一个成熟的替代方案,它可以替代试图在 NSMenu 中粘贴滚动视图。

于 2013-05-27T04:24:13.180 回答
0

您需要使用数组内容来判断子字符串。这将列出您完全匹配的记录(这是加分点)。另一个是这也会避免你滚动。

您必须通过以下方式更改委托方法,这将解决问题。

-(NSArray *)tokenField:(NSTokenField *)tokenField completionsForSubstring:(NSString *)substring indexOfToken:(NSInteger)tokenIndex indexOfSelectedItem:(NSInteger *)selectedIndex
{
    NSArray *arrayContents = @[@"A",@"B",@"C"];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[cd] %@", substring];
    return [NSArray arrayWithArray:[arrayContents filteredArrayUsingPredicate:predicate]];
}

希望这会帮助你。

于 2013-05-30T06:19:52.687 回答