2011-08-16 12 views
7

NSTokenField私は連絡先を選択することができます(Mail.appのように)。したがって、NSTextFieldは、model.recipientインスタンス変数の配列にバインドされています。NSTokenFieldはぼかしのトークンをチェックしません

ユーザは、自動完了リストからエントリを選択できるようになりました。 Joe Bloggs: [email protected]と入力するとすぐに(Joe Bloggs)トークンが表示され、model.recipientsにはBBContactというエントリが含まれるようになりました。今

ユーザーが作成され、NSTokenFieldDelegateメソッドが呼び出されませんでしたいくつかのキーを入力するために開始します(そう提案が示されている)、その後タブを打つ代わりに完了テキスト(Joe Bloggs: [email protected])の値でトークンを入力した場合、私はこの出来事に応えることができました。 model.recipientエントリにBBContactエントリの代わりにNSStringが含まれるようになりました。

奇妙なことに、デリゲートメソッドtokenField:shouldAddObjects:atIndex:は呼び出されません。これは、ユーザーがトークンフィールドからタブアウトしたときに期待するものです。

enter image description here

答えて

6

デリゲートでタブを押すとisValidObjectが呼び出されるので、NSTokenFieldではNOを返しますが、英数字がない場合はYESを返します。そうしないと、ユーザーはフィールドから離れてフォーカスすることができなくなります多くのトークンが存在するかに基づいて、目に見えないUnicode文字)

私が思い付くことができ壊れにくく実装ですが:

- (BOOL)control:(NSControl *)control isValidObject:(id)token 
{ 
    if ([control isKindOfClass:[NSTokenField class]] && [token isKindOfClass:[NSString class]]) 
    { 
     if ([token rangeOfCharacterFromSet:[NSCharacterSet alphanumericCharacterSet]].location == NSNotFound) return YES; 
     return NO; 
    } 
    return YES; 
} 
-1

「ENTER」キーは「タブ」キーはそれにテキストを追加し、それは行動だとトークン・フィールドのイベントを送信することがありますので、これは可能性があります。 -isContinuousプロパティをYESに設定し、目的の結果が得られたかどうかを調べることができます。

+0

ので、私はすぐにそれを試してみたが、問題は、私はまだ同じ動作をし持続します。 – Besi

+0

私は 'isValidObject'コールバックを使用して現在作業しています – Besi

0

私は、@ valexaの提案を使用して問題を解決することができました。 TABでぼかしが発生した場合は、すべての項目を調べて、すべての文字列の接点オブジェクトを検索する必要があります。有望な響き

- (BOOL)control:(NSControl *)control isValidObject:(id)token{ 
    if ([control isKindOfClass:[NSTokenField class]] && [token isKindOfClass:[NSString class]]) 
    { 
     NSTokenField *tf = (NSTokenField *)control; 

     if ([token rangeOfCharacterFromSet:[NSCharacterSet alphanumericCharacterSet]].location == NSNotFound){ 
      return YES; 
     } else { 

      // We get here if the user Tabs away with an entry "pre-selected" 
      NSMutableArray *set = @[].mutableCopy; 
      for(NSObject *entry in tf.objectValue){ 

       GSContact *c; 
       if([entry isKindOfClass:GSContact.class]){ 
        c = (GSContact *)entry; 
       } 

       if([entry isKindOfClass:NSString.class]){ 

        NSString *number = [[(NSString *)entry stringByReplacingOccurrencesOfString:@">" withString:@""] 
             componentsSeparatedByString:@"<"][1]; 
        c = [self findContactByNumber:number]; 
       } 

       if(c) [set addObject:c]; 
      } 

      [control setObjectValue:set]; 
     } 
    } 
    return YES; 
} 

enter image description here

+0

あなたは私のソリューションの具体的な実装でこの問題に答えるためのポイントを授与しましたか?私はそれがstackoverflowのルールに反するかもしれないと思う。 – valexa

関連する問題