Enter キーを押すとトークンが作成される NSTokenField があります。このフィールドのトークン数を制限したいと思います。たとえば、ユーザーが 2 つのトークンを次々に入力できるようにする必要があるとします。後で、ユーザーがトークンを設定することも、ユーザーがさらに検索することも許可されないようにする必要があります。つまり、ユーザーは 2 トークン後にブロックされます。
誰でもこれを達成するのを手伝ってくれませんか???
前もって感謝します :)
Enter キーを押すとトークンが作成される NSTokenField があります。このフィールドのトークン数を制限したいと思います。たとえば、ユーザーが 2 つのトークンを次々に入力できるようにする必要があるとします。後で、ユーザーがトークンを設定することも、ユーザーがさらに検索することも許可されないようにする必要があります。つまり、ユーザーは 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;
}
トークンをデータベースに保存すると、特定のユーザー 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
})
}
私はそれをテストしましたが、タグを入力したり、タグをコピーして貼り付けたりするときにも機能します。