如何过滤用户输入,以便每个单词都有一个前缀

时间:2013-08-05 08:46:22

标签: ios objective-c cocoa-touch

我正在尝试按Hashtag创建搜索。用户可以输入单词。

现在我需要验证:

  • 用户每个单词只有1个#标签

  • 每个单词只有1个#标签。

  • 如果单词不以标签开头,则放置一个。

  • 用户未输入超过1个空格删除额外空格

  • 用户没有使用其他常见的分隔符来分离昏迷或半昏迷等词语

我已经生成了以下代码,但每次我开始一个新单词时,它会删除两个单词之间的空格,并且不可能有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;
}

1 个答案:

答案 0 :(得分:1)

每次用户点击键盘上的键或粘贴到文本字段时,都会调用您正在使用的委托方法。

何时调用,文本字段的text属性仍然与用户点击密钥之前的属性相同。调用该方法以询问是否允许用户提议的更改进入该字段。所以,你的方法有几个问题:

  • 在实际进行更改之前,您正在对文本字段的内容执行所有验证,因此您实际上将验证在上一页键上输入的内容。您可以通过在委托方法开始时自行进行更改并对该新字符串执行验证来克服此问题:

    NSString *proposedText = [textField.text stringByReplacingCharactersInRange:range withString:replacementString];
    
  • 您正在返回YES,表示可以进行建议的更改,还可以更新文本字段的文本值。这意味着建议的更改可能会发生在您刚刚更新的值上。如果您在此方法中自己设置文本,请返回NO