我的问题是NSTokenField不允许我键入我想要的任何文本,它只允许我键入包含在NSArray中的字符串,tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem:返回。
- (NSArray *)tokenField:(NSTokenField *)tokenField completionsForSubstring:(NSString *)substring indexOfToken:(NSInteger)tokenIndex indexOfSelectedItem:(NSInteger *)selectedIndex {
return [NSArray arrayWithObjects:@"AA", @"BB", @"CC", @"DD", nil];
}
我的NSTokenField只能包含上面的文本标记。例如,如果我输入XXX,它不会出现,也无法添加。
为什么会发生这种情况,因为文档提到"用户可以输入一个字符串,这个字符串不在可能的补全列表中,并且也被标记化了。"
我错过了什么
selectedItemIndex的默认值是0 -返回列表中的第一项。
如果substring没有出现在列表中,你需要将这个值设为-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;
}