Как проверить, что все токены действительны в NSTokenField

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

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

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

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

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


person Jay    schedule 15.06.2011    source источник


Ответы (3)


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

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

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

person zonble    schedule 15.06.2011

Я также борюсь с этой проблемой и обнаружил, что использование 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;        
}
person Ira Cooke    schedule 28.08.2013

Я пробовал немного другой подход и вместо этого следил за клавишей табуляции, меняя ее на клавишу возврата. Этот метод делегата сначала подтверждает, что это соответствующее поле токена, и проверяет селектор команд.)

Приносим свои извинения за то, что оставили этот ответ на Swift - надеюсь, это допустимо, учитывая прошедшие 8,5 лет.

func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool
{
    if control == tokenField, // my interested token field
        commandSelector == #selector(insertTab(_:))
    {
        textView.insertNewline(self)
        return true
    }
    
    return false
}
person DDP    schedule 03.09.2020