3

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

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

提前致谢 :)

4

3 回答 3

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;
}
于 2014-06-06T17:00:58.647 回答
0

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

于 2013-07-15T08:43:05.553 回答
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
    })
}

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

于 2018-09-08T03:59:51.263 回答