Cocoa 如何限制NSTokenField中令牌的数量?

Cocoa 如何限制NSTokenField中令牌的数量?,cocoa,nstokenfield,Cocoa,Nstokenfield,我有一个NSTokenField,在这里,在按enter键时会创建令牌。我想限制此字段中令牌的数量。比如说,应该只允许用户一个接一个地输入2个令牌。稍后,不应允许用户设置令牌,也不应允许用户进一步搜索。简而言之,应该在2个令牌之后阻止用户 有谁能帮我做到这一点吗 提前感谢:)如果您将令牌保存在db中,您可以计算特定用户id的行数,并添加If语句将其限制为2。解决方案分为两部分: -(NSArray *)tokenField:(NSTokenField *)tokenField shouldAdd

我有一个NSTokenField,在这里,在按enter键时会创建令牌。我想限制此字段中令牌的数量。比如说,应该只允许用户一个接一个地输入2个令牌。稍后,不应允许用户设置令牌,也不应允许用户进一步搜索。简而言之,应该在2个令牌之后阻止用户

有谁能帮我做到这一点吗


提前感谢:)

如果您将令牌保存在db中,您可以计算特定用户id的行数,并添加If语句将其限制为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;
}
其中,它是一个大于0的整数 该委托涵盖所有情况,如通过复制/粘贴添加的令牌、完成列表、拖放、手动写入等

另一个委托涉及用户编写字符串并点击“TAB”的情况

瞧:

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
    })
}
var-maximumTokens:Int=2
func tokenField(tokenField:NSTokenField,shouldAdd tokens:[Any],位于索引:Int)->[Any]{
变量计数=0
如果让textView=tokenField.currentEditor()作为?NSTextView{
对于textView.string.unicodeScalars中的标量{
如果scalar.value==unichar(NSAttachmentCharacter){
计数+=1
}
}
}
返回令牌。筛选器({uu}in
计数+=1

return count谢谢您的回答,但这与完成列表无关。请限制标记字段中存在的标记。我想限制NSTokenField实例的objectValue。objectValue包含所选标记的数量。@AbdulNaveed我想blo在这里有些问题,为什么不跟踪何时添加完成,然后启动ret如果($count>=2){//do something}
我不想限制完成列表的计数。我说的是NSTokenField中的标记。
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
    })
}