我正在学习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/