Objective c NSTokenField不允许我键入除tokenField:completionsForSubstring:。。。返回

Objective c NSTokenField不允许我键入除tokenField:completionsForSubstring:。。。返回,objective-c,cocoa,delegates,nstokenfield,Objective C,Cocoa,Delegates,Nstokenfield,我的问题是,NSTokenField不允许我键入任何想要的文本,它只允许我键入tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem:返回的NSArray中包含的字符串 - (NSArray *)tokenField:(NSTokenField *)tokenField completionsForSubstring:(NSString *)substring indexOfToken:(NSInteger)toke

我的问题是,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];
}
My NSTokenField只能包含上述文本标记。 如果我键入例如XXX,则它不会出现,并且无法添加

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


我缺少什么?

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;
}