0

による検索を作成しようとしていますHashtag。ユーザーは単語を入力できます。

今、私は検証する必要があります:

  • ユーザーは単語ごとに 1 つのハッシュタグしか持っていません

  • 単語ごとに 1 つのハッシュタグしかありません。

  • 単語がハッシュタグで始まらない場合は、ハッシュタグを配置します。

  • ユーザーは複数のスペースを入力していません 余分なスペースを削除してください

  • ユーザーは、coma や semi-coma などの単語を区切るために、他の一般的な区切り記号を使用しませんでした

次のコードを作成しましたが、新しい単語を開始するたびに、2 つの単語の間のスペースが削除され、2 つの単語を使用できなくなるか、2 番目の単語を使用できるようになりますが#、二番目の言葉。

誰かが私の検証のロジックを手伝ってくれませんか?

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    // Delete double spaces between words
    NSString* str = [textField.text stringByReplacingOccurrencesOfString:@" " withString:@" "];

    if ( [str isEqualToString:@""] ) {
        return YES;
    }

    // Check for other methods that people could use to separate strings
    str = [str stringByReplacingOccurrencesOfString:@"," withString:@"#"];
    str = [str stringByReplacingOccurrencesOfString:@";" withString:@"#"];

    // separate string by Hashtag
    NSArray * words = [str componentsSeparatedByString:@"#"];
    NSMutableArray * ma =[[NSMutableArray alloc]init];
    for (NSString* str4 in words) {
        if ( ![str4 isEqualToString:@""]) {
            // Separate string by space
            NSArray * words2 = [str4 componentsSeparatedByString:@" "];
            if ( [words2 count] != 0) {
                [ma addObjectsFromArray:words2];
            }
        }
    }
    words = [[NSArray alloc]initWithArray:ma];
    NSString * newStr = [[NSString alloc]init];

    // Make the new string
    for (NSString* str2 in words) {
        if ( ![str2 isEqualToString:@""]) {
            NSString* str3 = str2;
            str3 = [NSString stringWithFormat:@"#%@ ",str3];
            newStr = [newStr stringByAppendingString:str3];
        }
    }
    textField.text = newStr;
    return YES;
}
4

1 に答える 1

1

使用しているデリゲート メソッドは、ユーザーがキーボードのキーをタップするか、テキスト フィールドに貼り付けるたびに呼び出されます。

呼び出されたとき、テキスト フィールドのtextプロパティは、ユーザーがキーをタップする前と同じままです。このメソッドは、ユーザーが提案した変更をフィールドに許可するかどうかを尋ねるために呼び出されます。したがって、あなたの方法にはいくつかの問題があります。

  • 変更が実際に行われる前に、テキスト フィールドの内容に対してすべての検証を実行しているため、実際には、にキーを押したときに入力された内容を検証することになります。デリゲート メソッドの開始時に自分で変更を加え、その新しい文字列に対して検証を実行することで、これを克服できます。

    NSString *proposedText = [textField.text stringByReplacingCharactersInRange:range withString:replacementString];
    
  • 戻ってきYESて、提案された変更を行っても問題ないと言って、テキスト フィールドのテキスト値も更新しています。これは、提案された変更が、更新したばかりの値に対して発生する可能性があることを意味します。このメソッドでテキストを自分で設定している場合は、 を返しNOます。

于 2013-08-05T09:43:02.127 に答える