我有一个 NSTokenField 在其中创建令牌时按回车键。我想限制此字段中的令牌数量。例如,应该允许用户一个接一个地输入 2 个令牌。之后,既不允许用户设置令牌,也不允许用户进一步搜索。简而言之,用户应该在 2 个令牌之后被阻止。
任何人都可以帮助我实现这一目标吗???
提前致谢 :)
我有一个 NSTokenField 在其中创建令牌时按回车键。我想限制此字段中的令牌数量。例如,应该允许用户一个接一个地输入 2 个令牌。之后,既不允许用户设置令牌,也不允许用户进一步搜索。简而言之,用户应该在 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;
}
如果将令牌保存在 db 中,则可以计算特定用户 id 的行数,并添加 if 语句将其限制为 2。
看哪:
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
})
}
我已经对其进行了测试,它在您输入标签甚至复制和粘贴标签时都可以使用。