9

Apple は便利なことに、NSTokenField に追加される新しいトークンが有効であることを確認できるコールバック メソッドを作成しました。

- (NSArray *)tokenField:(NSTokenField *)tokenField shouldAddObjects:(NSArray *)newTokens atIndex:(NSUInteger)index

私はこれを実装しましたが、1 つのケースを除いてうまく機能することがわかりました。ユーザーがトークンの入力を開始したが、まだトークンの入力を完了していない場合、ユーザーが TAB キーを押しても、検証メソッドは呼び出されません。

これは、ユーザーがタブを押して検証をバイパスできることに気付かない限り、入力されたすべてのトークンが有効であることを確認できることを意味します。

この状況を処理する正しい方法を知っている人はいますか?

4

3 に答える 3

7

しばらく試してみたところ、Tabキーが押されたときに、トークンフィールドがNSControlTextEditingDelegateプロトコルのcontrol:isValidObject:を呼び出すことがわかりました。したがって、次のようなデリゲートメソッドを実装できます

- (BOOL)control:(NSControl *)control isValidObject:(id)object
{
    NSLog(@"control:%@", control);
    NSLog(@"object:%@", object);
    return NO;
}

'object'パラメータは、不完全なトークンの内容です。メソッドがNOを返す場合、トークンは有効なトークンの配列に挿入されません。

于 2011-06-15T14:34:49.717 に答える
2

私もこの問題に苦労しており、zonble によって提案されているように control:isValidObject を使用するとほぼ解決することがわかりましたが、オブジェクト パラメーターに基づいて NO または YES を返すかどうかを判断するのは難しいことがわかりました。私が知る限り、この問題はタブ キーにのみ限定されているため、次のようにメソッドのペアを実装しました。

これはひどく醜いことを認識していますが、NSTokenField の他の NSTextField 動作 (カーソルを新しい位置に移動するなど) に影響を与えずに、タブにトークンを作成することを避けるために NSTokenField を取得できる唯一の方法です。

- (BOOL)control:(NSControl *)control isValidObject:(id)object
{
    if (self.performingTab) {
        self.performingTab=NO;
        return NO;
    } else {
        return YES;
    }
}

- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor
doCommandBySelector:(SEL)commandSelector 
{        
    if (commandSelector==@selector(insertTab:)) {
        self.performingTab=YES;
    }        
    return NO;        
}
于 2013-08-28T11:45:31.673 に答える