我从另一个堆栈溢出帖子中找到了这段代码
- (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个字符!这太奇怪了!!谢谢你的帮助!!
答案 0 :(得分:0)
你永远不会计算upperLeftLength
,因为你刚刚回来。因此,您需要做的是计算upperLeftLength
和upperRightLength
,然后确定它是返回是还是否。在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;
}
}
}