NSTokenField选择列表在滚动时显示空白区域

时间:2013-05-23 13:31:25

标签: objective-c macos cocoa nstokenfield

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

当我输入A时,会显示弹出窗口中的选择。

As I type A

我滚动了

enter image description here

更多滚动,它在可见区域下方。

enter image description here

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

邮件应用程序没问题,工作正常。

我的实施是:

  1. 创建了NSTokenField

  2. 将其委托设置为AppDelegate。

  3. 在实施文件

     -(NSArray *)tokenField:(NSTokenField *)tokenField completionsForSubstring:(NSString *)substring indexOfToken:(NSInteger)tokenIndex indexOfSelectedItem:(NSInteger *)selectedIndex{
        return @[@"A",@"B",@"C"];
    }
    
  4. 即使sample code from apple documentation行为也不正确。

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

2 个答案:

答案 0 :(得分:0)

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

F-Scripting FTW

绕过非常差的scrollWheel: NSMenu恰好已经实现了,这是一个相当古老的技巧。 MTTokenField是一种成熟的替代品,可以将你的头发拉出来,试图在NSMenu中粘贴滚动视图。

答案 1 :(得分: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]];
}

希望这会对你有所帮助。