我是iOS新手,对以下代码的行为感到困惑。我想验证邮政编码并在用户输入超过5位数时发出警报。我正在使用数字键盘来确保除了nums之外我什么也得不到。
警报引发第6位数,这就是我想要的。如果我按下“后退按钮”删除最后一位数字,在0-3位置,它表现得很好并删除最后一位数字。如果我点击位置4的“后退按钮”,警报就会抛出。我究竟做错了什么?如何删除第5位数字(数组中的位置4)?
由于
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if ([zipText.text length] <= 4)
{
return YES;
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Zip Code Limit" message:@"The system only requires a 5 digit zip code." delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil, nil];
[alert show];
[alert release];
return NO;
}
}
答案 0 :(得分:1)
您需要更复杂的测试。您当前的测试说:“如果zipText.text中有四个或更少的字符,请允许更改。”它应该说:“如果用户的更改将导致超过5个字符,则禁止更改。”换句话说,如果用户试图删除第五个字符,请不要拒绝更改。
顺便说一句,你的头衔是误导性的。运算符完全按预期工作:[zipText.text length] <= 4
在长度为5时按预期失败。
答案 1 :(得分:1)
问题是在更新文本字段值之前触发了函数- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
。您需要做的是检查replacementString
是否实际上是退格符,只返回YES
。如果不是检查字符串的长度是否为5,如果是,则返回NO
。
您可以按照以下方式执行以下操作:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if ([string characterAtIndex:0] == 10)
{
return YES;
}
else if ([zipText.text length] >= 5)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Zip Code Limit" message:@"The system only requires a 5 digit zip code." delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil, nil];
[alert show];
[alert release];
return NO;
}
return YES;
}
希望这有帮助。
答案 2 :(得分:1)
您正在根据文本字段的先前内容进行测试,而不是根据编辑后存在的内容进行测试。您希望根据编辑后的内容进行测试。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
{
NSString *oldString = textField.text;
NSString *newString = [oldString stringByReplacingCharactersInRange:range
withString:string];
if ([newString length] <= 5) {
return YES;
} else {
// do alert stuff
return NO;
}
}
这种技术的好处是可以使用长度以外的比较。您只需在批准之前检查编辑的实际结果。它比试图弄清楚按键是什么要简单得多。
您可能希望养成在委托方法中不引用变量(如zipTest)的习惯。使用文本字段参数,以防您是多个文本字段的委托。
答案 3 :(得分:1)
如果我理解正确,你想允许5位长的数字(位置0-4,长度:5),但是if ([zipText.text length] <= 4)
你接受的最长数字只能是4位数(位置0-3) ,长度:4)。您应该将if ([zipText.text length] <= 4)
更改为if ([zipText.text length] <= 5)
。