如何限制NSTokenField中的标记数?

时间:2013-07-15 08:39:48

标签: cocoa nstokenfield

我有一个NSTokenField,在输入时创建了令牌。我想限制此字段中的令牌数量。例如,应该允许用户一个接一个地输入2个令牌。之后,不允许任何用户设置令牌,也不允许用户进一步搜索。简而言之,用户应该在2个令牌后被阻止。

任何人都可以帮助我实现这个目标吗?

提前致谢:)

3 个答案:

答案 0 :(得分:2)

解决方案分为两部分:

-(NSArray *)tokenField:(NSTokenField *)tokenField shouldAddObjects:(NSArray *)tokens atIndex:(NSUInteger)index
{
    //limit the tokens
    if(self.tokensLimit)
    {
        NSArray * tokensArray = [_tokenField objectValue];

        if([tokensArray count] > 0)
        {
            if([tokens isEqualToArray:tokensArray])
            {
                return tokens;
            }
            else if([tokensArray count]>=self.tokensLimit)
            {
                return @[];
            }
            else if([tokens count]>0)
            {
                tokens = [tokens subarrayWithRange:NSMakeRange(0, MIN([tokens
                                                                       count], self.tokensLimit))];
            }
            else
                return @[];
        }
        else
        {
            tokens = [tokens subarrayWithRange:NSMakeRange(0, MIN([tokens count], self.tokensLimit))];
        }
    }

    return tokens;
}

其中tokensLimit是一个int> 0 代表涵盖所有案例,如通过复制/粘贴添加的令牌,完成列表,拖放,手动编写等。

这个其他代表涵盖用户编写字符串并点击" TAB"

的情况
- (BOOL)control:(NSControl *)control isValidObject:(id)object
{
    if(self.tokensLimit)
    {
        NSArray * tokensArray = [_tokenField objectValue];
        tokensArray = [tokensArray subarrayWithRange:NSMakeRange(0, MIN([tokensArray count], self.tokensLimit))];
        [_tokenField setObjectValue:tokensArray];
    }
    return YES;
}

答案 1 :(得分:0)

如果将令牌保存在数据库中,则可以计算特定用户ID的行数,并添加if语句将其限制为2。

答案 2 :(得分:0)

看哪:

var maximumTokens: Int = 2    
func tokenField(_ tokenField: NSTokenField, shouldAdd tokens: [Any], at index: Int) -> [Any] {
            var count = 0
    if let textView = tokenField.currentEditor() as? NSTextView {
        for scalar in textView.string.unicodeScalars {
            if scalar.value == unichar(NSAttachmentCharacter) {
                count += 1
            }
        }
    }

    return tokens.filter({ _ in
        count += 1
        return count <= maximimTokens
    })
}

我已经对其进行了测试,当您键入标签甚至复制并粘贴它们时,它都可以使用。