3

我的问题是 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,它不会出现并且无法添加。

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

我错过了什么?

4

1 回答 1

3

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;
}
于 2011-10-09T04:53:18.070 回答