如何验证所有令牌在NSTokenField中有效

时间:2011-06-15 14:14:49

标签: objective-c cocoa nstokenfield

Apple已经方便地创建了一个回调方法,允许您检查添加到NSTokenField的新标记是否有效:

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

我已经实现了这一点,事实证明它除了在一个案例中之外效果很好。如果用户开始键入令牌但尚未完成键入令牌,并且用户按下TAB键,则不会调用验证方法。

这意味着我能够确保输入的所有令牌都是有效的,除非用户计算出来,他们可以按Tab键绕过验证。

有谁知道处理这种情况的正确方法是什么?

3 个答案:

答案 0 :(得分:7)

我试了一会儿,当按下Tab键时,我发现令牌字段调用了控件:isValidObject:NSControlTextEditingDelegate协议。因此,您可以实现委托方法,例如

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

'object'参数是不完整令牌的内容。如果方法返回NO,则不会将令牌插入有效令牌数组。

答案 1 :(得分:2)

我也在努力解决这个问题,发现使用控件:zonble建议的isValidObject几乎可以解决问题,但很难根据对象参数确定是否返回NO或YES。据我所知,这个问题仅限于tab键,所以我实现了一对方法,如下所示;

我意识到这非常丑陋,但这是我能够让NSTokenField避免在Tab上创建令牌而不会影响NSTokenField的其他NSTextField行为(例如将光标移动到新位置等)的唯一方法。

- (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;        
}

答案 2 :(得分:0)

我尝试了一种稍微不同的方法,而是注意Tab键,将其更改为返回键。该委托方法首先确认它是相关的令牌字段,然后检查命令选择器。)

将这个答案留在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
}