我正在学习 iOS 开发,并且很难弄清楚控件的各种事件。对于测试,我有一个 UITextField,用户需要输入以下格式的字符串: XXXX-XXXX-XXXX-XXXX
我希望能够检查每个条目后字段中的文本有多长,并查看是否需要附加连字符。我已经为此设置了 IBAction 函数,但是当我将其分配给“值更改”事件时,它什么也不做,当我将其设置为“编辑结束”时,它工作正常,但只有在用户退出时才会调用控制。
只是补充一下,“编辑已更改”事件也会导致它崩溃。我认为这是堆栈溢出或文本设置再次调用事件处理程序的情况。
简而言之,有没有办法为用户每次在 UITextField 中输入字符时设置事件处理程序?
请注意,之前的答案严重不足。天堂禁止您的用户输入错误的数字并敢于尝试删除它!公平地说,发帖者指出该代码可能无法完美运行。但是,它甚至无法编译,因此买家要注意过滤器应该已经很高了。如果您修复编译错误并尝试代码,您会发现您很容易得到与海报规定的格式不匹配的输入。
这是我用来将文本字段限制为格式为 123-456-7890 的电话号码的解决方案。调整其他数字格式很简单。注意传递的使用NSRange。顺便说一句,即使使用数字虚拟键盘,也需要拒绝非数字字符,因为用户仍然可以通过硬件键盘输入非数字。
另一张纸条。我添加连字符after输入第 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)