NSTokenField не позволяет мне вводить строки, отличные от tokenField: завершенийForSubstring: ... возвращает - PullRequest
3 голосов
/ 08 октября 2011

Моя проблема в том, что NSTokenField не позволяет мне печатать любой текст, который я хочу, он только позволяет мне вводить строки, включенные в NSArray, которые tokenField: completetionsForSubstring: 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, он не появится и не может быть добавлен.

Почему это происходит, поскольку в документации упоминается «Пользователь может ввести строку, которой нет в списке возможных завершений, и которая также маркирована. "

Чего мне не хватает?

1 Ответ

3 голосов
/ 09 октября 2011

Значением по умолчанию для 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;
}
...