Как проверить, что все токены действительны в NSTokenField - PullRequest
8 голосов
/ 15 июня 2011

Apple удобно создала метод обратного вызова, который позволяет вам проверить, что новые токены, добавляемые в NSTokenField, действительны:

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

Я реализовал это, и оказалось, что он работаетотлично за исключением одного случая.Если пользователь начинает вводить токен, но еще не завершил ввод токена, и пользователь нажимает клавишу TAB, метод проверки не вызывается.

Это означает, что я могу гарантировать, что все токены, которыевведены действительны, если пользователь не работает, они могут нажать Tab, чтобы обойти проверку.

Кто-нибудь знает, как правильно справиться с этой ситуацией?

Ответы [ 2 ]

7 голосов
/ 15 июня 2011

Я попытался немного и обнаружил, что поле токена вызывает control: isValidObject: протокола NSControlTextEditingDelegate при нажатии клавиши Tab. Таким образом, вы можете реализовать метод делегата, такой как

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

Параметр 'object' является содержимым вашего неполного токена. Если метод возвращает NO, токен не будет вставлен в массив допустимых токенов.

2 голосов
/ 28 августа 2013

Я также борюсь с этой проблемой и обнаружил, что использование control: isValidObject, как предлагает zonble, почти достигает решения, но трудно определить, возвращать ли 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;        
}
...