【问题标题】:NSTokenField does not let me type other strings than tokenField:completionsForSubstring:... returnsNSTokenField 不允许我输入除 tokenField:completionsForSubstring:... 以外的其他字符串
【发布时间】:2011-10-09 12:53:18
【问题描述】:

我的问题是 NSTokenField 不允许我输入任何我想要的文本,它只允许我输入包含在 tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem: 返回的 NSArray 中的字符串。

- (NSArray *)tokenField:(NSTokenField *)tokenField completionsForSubstring:(NSString *)substring indexOfToken:(NSInteger)tokenIndex indexOfSelectedItem:(NSInteger *)selectedIndex      {
return [NSArray arrayWithObjects:@"AA", @"BB", @"CC", @"DD", nil];
}

我的 NSTokenField 只能包含上述文本标记。 如果我输入例如 XXX,它不会出现并且无法添加。

为什么会发生这种情况,因为文档中提到“用户可以输入一个不在可能完成列表中并且也被标记化的字符串。”

我错过了什么?

【问题讨论】:

    标签: objective-c cocoa delegates nstokenfield


    【解决方案1】:

    selectedItemIndex 的默认值为 0 — 返回列表中的第一项。

    因此,如果您的列表中未显示子字符串,则您需要将其设置为 -1(否则它将用您第一次完成的文本替换用户键入的文本)

    仅返回完成列表中实际计算用户键入的前缀的内容。 (这通常是正确的用户体验。)

    - (NSArray *)tokenField:(NSTokenField *)tokenField completionsForSubstring:(NSString *)substring indexOfToken:(NSInteger)tokenIndex indexOfSelectedItem:(NSInteger *)selectedIndex
    {
       NSArray *completions = [NSArray arrayWithObjects:@"AA", @"BB", @"CC", @"DD", nil];
       NSMutableArray *filteredCompletions = [NSMutableArray array];
    
       [completions enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
           if ([[obj lowercaseString] hasPrefix:[substring lowercaseString]])
               [filteredCompletions addObject:obj];
       }];
    
       return filteredCompletions;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-18
      • 2017-08-30
      • 2022-06-14
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      相关资源
      最近更新 更多