我正在学习iOS开发,并且很难弄清控件的各种事件。为了进行测试,我有一个UITextField,用户应在其中输入以下格式的字符串:XXXX-XXXX-XXXX-XXXX

我希望能够检查每次输入后字段中的文本有多长时间,并查看是否需要在其后附加连字符。我已经为此设置了IBAction函数,但是当我将其分配给“Value Changed”事件时,它什么也没做,当我在“Edited Did End”上设置它时,它可以正常工作,但是只有当用户退出控制。

编辑:只需添加一下,“编辑更改”事件也会导致其崩溃。我假设这是堆栈溢出或某些文本设置再次调用事件处理程序的事件。

简而言之,每当用户在UITextField中输入字符时,是否有任何方法可以设置事件处理程序?

最佳答案

请注意,先前的答案严重不足。 Heaven禁止您的用户输入错误的数字并敢于尝试删除它!公平地讲,张贴者指出该代码可能无法完美运行。但是然后,它甚至无法编译,因此买方要提防过滤器已经很高。如果您修复了编译错误并尝试了代码,您将看到您很容易以与海报规定格式不符的输入而告终。

这是我用于将文本字段限制为格式为123-456-7890的电话号码的解决方案。调整其他数字格式是微不足道的。注意传递的 NSRange 的使用。顺便说一句,即使使用数字虚拟键盘,也需要拒绝非数字字符,因为用户仍然可以通过硬件键盘输入非数字字符。

另一注。我在第4位和第7位之后添加了连字符,以使数字的删除更加容易。如果在第3位和第6位后面添加数字,则必须处理删除悬挂的连字符的情况。下面的代码避免了这种用例。

// Restrict entry to format 123-456-7890
- (BOOL)                textField:(UITextField *)textField
    shouldChangeCharactersInRange:(NSRange)range
                replacementString:(NSString *)string {

  // All digits entered
  if (range.location == 12) {
    return NO;
  }

  // Reject appending non-digit characters
  if (range.length == 0 &&
       ![[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[string characterAtIndex:0]]) {
    return NO;
  }

  // Auto-add hyphen before appending 4rd or 7th digit
  if (range.length == 0 &&
      (range.location == 3 || range.location == 7)) {
    textField.text = [NSString stringWithFormat:@"%@-%@", textField.text, string];
    return NO;
  }

  // Delete hyphen when deleting its trailing digit
  if (range.length == 1 &&
      (range.location == 4 || range.location == 8))  {
    range.location--;
    range.length = 2;
    textField.text = [textField.text stringByReplacingCharactersInRange:range withString:@""];
    return NO;
  }

  return YES;
}

关于iOS自动在文本字段中添加连字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6968331/

10-12 00:15
查看更多