2011-10-08 30 views
3

我的問題是,NSTokenField不允許我型我想要的任何文字,它只是讓我鍵入包含在NSArray的字符串tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem:返回。NSTokenField不會讓我比tokenField鍵入其他字符串:completionsForSubstring:...返回

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

我的NSTokenField只能包含上述文本標記。 如果我鍵入例如XXX,它不會出現,並且不能添加它。

爲什麼發生這種情況,因爲該文件提到了「用戶可以輸入一個字符串,是不是在可能的補全列表,並且也標記化。」

我錯過了什麼?

回答

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