我有一个NSTokenField,在输入时创建了令牌。我想限制此字段中的令牌数量。例如,应该允许用户一个接一个地输入2个令牌。之后,不允许任何用户设置令牌,也不允许用户进一步搜索。简而言之,用户应该在2个令牌后被阻止。
任何人都可以帮助我实现这个目标吗?
提前致谢:)
答案 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
})
}
我已经对其进行了测试,当您键入标签甚至复制并粘贴它们时,它都可以使用。