3

私の問題は、NSTokenFieldでは必要なテキストを入力できないことです。トークンフィールド: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 に答える