【问题标题】:using rangeOfString and textfield shouldChangeCharactersInRange - the delete character?使用 rangeOfString 和 textfield shouldChangeCharactersInRange - 删除字符?
【发布时间】:2013-11-13 21:22:04
【问题描述】:

我正在使用 rangeofString 和 textfield: shouldChangeCharactersinRange: 来限制在文本字段中有效的击键类型。

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


    NSString *includeString = @"1234567890-()+" ;

    if ([includeString rangeOfString:string].location == NSNotFound) {
        return NO;
    }

return YES;

}

这很好用,除了我现在不能使用删除键。任何想法如何表示删除键以将其添加到 includeString 中?

我试过了

`NSString *includeString = @"1234567890-()+\b"

但这不起作用 - 它也不允许出现我认为奇怪的 \ 或 b 字符

谢谢

【问题讨论】:

  • 特殊转义序列\b 被编译器转换为退格字符。用户不能输入退格字符。当用户删除文本时,替换字符串只是空的。这就是为什么\b 不起作用以及为什么你不能输入反斜杠或b

标签: ios objective-c nsstring textfield


【解决方案1】:

删除字符时,替换字符串string。 由于rangeOfString:string 为空字符串返回NSNotFound, 您必须先检查这种情况:

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

    if ([string length] == 0)
        return YES;
    NSString *includeString = @"1234567890-()+" ;
    if ([includeString rangeOfString:string].location == NSNotFound) {
        return NO;
    }
    return YES;
}

更新:正如@rmaddy 正确指出的那样,如果不止一个,上述方法会失败 字符被粘贴到文本字段中。以下方法检查是否 all 替换字符串的字符有效。 (可能有很多解决方案, 这只是其中之一。)

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

    static NSString *includeString = @"1234567890-()+";
    NSCharacterSet *includeSet = [NSCharacterSet characterSetWithCharactersInString:includeString];
    if ([[string stringByTrimmingCharactersInSet:includeSet] length] > 0)
        return NO;
    return YES;
}

注意,空字符串不再需要单独处理。

【讨论】:

  • 请记住,如果用户粘贴包含多个字符的文本,即使所有粘贴的字符都有效,此代码(也不是原始代码)将无法正常工作。
  • @rmaddy:你是对的!我只关注“删除”部分,并没有彻底考虑过。感谢您的更正,我已经更新了答案。
  • 很好的答案。制作includeString 本地静态可能会更好。顺便说一句,您可能还需要\n 以确保您的Done 按钮有效,即关闭键盘。
  • @Schultz9999:感谢您的反馈和建议。我已经相应地更新了答案。稍后我将测试换行/完成问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多