设置多个TextField的最大长度

时间:2014-03-08 08:05:18

标签: ios iphone objective-c uitextfield

我从另一个堆栈溢出帖子中找到了这段代码

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSUInteger upperRightLength = [upperRight.text length] + [string length] - range.length;
    return (upperRightLength > 1) ? NO : YES;
        }

我需要在多个textField上运行相同的代码(效果很好)。

我尝试了这个,但它似乎没有正确运行,并且没有相同的效果!

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSUInteger upperRightLength = [upperRight.text length] + [string length] - range.length;
    return (upperRightLength > 1) ? NO : YES;

    NSUInteger upperLeftLength = [upperLeft.text length] + [string length] - range.length;
    return (upperLeftLength > 1) ? NO : YES;
}

我不知道还能做什么!非常感谢你的帮助!!

编辑: 我现在尝试了另一个代码:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSUInteger upperRightLength = [upperRight.text length] + [string length] - range.length;
    NSUInteger upperLeftLength = [upperLeft.text length] + [string length] - range.length;
    return (upperLeftLength > 1 &&  upperRightLength > 1 ) ? NO : YES;
}

现在似乎也发生了同样的事情。我首先点击哪个文本字段(比如upperLeft)我仍然可以输入任意数量的字符。但是当我点击其他文本字段(upperRight)时,我只能输入1个字符。我首先尝试从(upperRight)开始,我看到相同的结果......其中(upperRight)允许我输入任意数量的内容,而(upperLeft)只允许我键入1个字符!这太奇怪了!!谢谢你的帮助!!

4 个答案:

答案 0 :(得分:0)

你永远不会计算upperLeftLength,因为你刚刚回来。因此,您需要做的是计算upperLeftLengthupperRightLength,然后确定它是返回还是。在upperLeftLength行上设置一个断点,你会看到你的断点永远不会被击中。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSUInteger upperRightLength = [upperRight.text length] + [string length] - range.length;
    NSUInteger upperLeftLength = [upperLeft.text length] + [string length] - range.length;
    return (upperLeftLength > 1 &&  upperRightLength > 1 ) ? NO : YES;
}

会起作用。

答案 1 :(得分:0)

我认为你错过了委托方法的要点。此方法为您提供正在编辑的textField,以便您可以使用提供给您的textField的引用而不使用ivar

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{
  NSUInteger length = [textField.text length] + [string length] - range.length;
  return !(length > 1);
}

更新

有许多不同的方法可以处理不同字段的不同长度。最简单的是:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{
  NSInteger maxLength = 1;

  if (textField == self.myOtherTextField) {
    maxLength = 2;
  }

  NSUInteger length = [textField.text length] + [string length] - range.length;
  return !(length > maxLength);
}

答案 2 :(得分:0)

更好的方法是使用didChange方法,例如UITextViewDelegate方法,但我们知道UITextFieldDelegate没有didChange方法。您可以手动添加行为。您可以使用shouldChangeCharactersInRange:方法,但我个人建议您不要覆盖方法,除非您绝对不得不这样做。

您可以使用以下方式添加行为:

[yourTextField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

在目标方法中:

- (void)textFieldDidChange:(UITextField*)textField{

    //handle code
}

这里的优点是,在知道代码生效之前,您不必等待用户键入另一个字符。一旦达到限制,您的代码就会生效。

如果您的textField是全局的,您可以使用textField == upperRight直接在此处访问它们,或者如果它们是以块的形式定义的,只需设置tag并检查{{1} }}

答案 3 :(得分:0)

试试这个

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{

     if (_card_Number==textField){
    if(range.length + range.location > textField.text.length)
            {
                return NO;
            }

            NSUInteger newLength = [textField.text length] + [string length] 
               - range.length;
            return newLength <= 19;

     }else if (_card_cvnf==textField){
    if(range.length + range.location > textField.text.length)
            {
                return NO;
            }

            NSUInteger newLength = [textField.text length] + [string length] - range.length;
            return newLength <= 4;
        }else{
                        return NO;
        }

    }
}