3

Enter キーを押すとトークンが作成される NSTokenField があります。このフィールドのトークン数を制限したいと思います。たとえば、ユーザーが 2 つのトークンを次々に入力できるようにする必要があるとします。後で、ユーザーがトークンを設定することも、ユーザーがさらに検索することも許可されないようにする必要があります。つまり、ユーザーは 2 トークン後にブロックされます。

誰でもこれを達成するのを手伝ってくれませんか???

前もって感謝します :)

4

3 に答える 3

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

トークンをデータベースに保存すると、特定のユーザー 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 に答える