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

问题描述

| Apple方便地创建了一个回调方法,该方法允许您检查要添加到NSTokenField的新令牌是否有效:
- (NSArray *)tokenField:(NSTokenField *)tokenField shouldAddobjects:(NSArray *)newTokens atIndex:(NSUInteger)index
我已经实现了这一点,事实证明它工作得很好,除了一种情况。如果用户开始键入令牌,但尚未完成令牌的键入,并且用户按TAB键,则不会调用验证方法。 这意味着我能够确保输入的所有令牌都是有效的,除非用户确定他们可以按Tab键绕过验证。 有谁知道处理这种情况的正确方法是什么?     

解决方法

        我尝试了一段时间,发现按下Tab键时,令牌字段调用了NSControlTextEditingDelegate协议的control:isValidObject:。因此,您可以实现一个委托方法,例如
- (BOOL)control:(NSControl *)control isValidObject:(id)object
{
    NSLog(@\"control:%@\",control);
    NSLog(@\"object:%@\",object);
    return NO;
}
\'object \'参数是您不完整令牌的内容。如果该方法返回NO,则令牌将不会插入到有效令牌的数组中。     ,        我也在这个问题上苦苦挣扎,发现使用zonble建议的control:isValidObject几乎可以解决问题,但是很难根据对象参数确定返回NO还是YES。据我所知,这个问题仅限于Tab键,因此我实现了如下两种方法: 我意识到这很丑陋,但这是我可以获取NSTokenField以避免在选项卡上创建标记同时又不影响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;        
}