< =运算符未按预期工作

时间:2011-08-07 19:15:12

标签: iphone

我是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;
        }
}

4 个答案:

答案 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)