设置UITextField最大长度

有什么办法来设置UITextField上的最大长度?

像HTMLinput字段中的MAXLENGTH属性。

这与退格和复制和粘贴正常工作:

#define MAXLENGTH 10 - (BOOL)textField:(UITextField *) textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSUInteger oldLength = [textField.text length]; NSUInteger replacementLength = [string length]; NSUInteger rangeLength = range.length; NSUInteger newLength = oldLength - rangeLength + replacementLength; BOOL returnKey = [string rangeOfString: @"\n"].location != NSNotFound; return newLength <= MAXLENGTH || returnKey; } 

更新:即使在MAXLENGTH,也更新为接受返回键。 谢谢罗杰斯先生!

UPDATE

我不能删除这个答案,因为这是可以接受的,但这是不正确的。 以下是从TomA复制的正确代码:

 #define MAXLENGTH 10 - (BOOL)textField:(UITextField *) textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSUInteger oldLength = [textField.text length]; NSUInteger replacementLength = [string length]; NSUInteger rangeLength = range.length; NSUInteger newLength = oldLength - rangeLength + replacementLength; BOOL returnKey = [string rangeOfString: @"\n"].location != NSNotFound; return newLength <= MAXLENGTH || returnKey; } 

原版的

我想你的意思是UITextField。 如果是,那么有一个简单的方法。

  1. 实现UITextFieldDelegate协议
  2. 实现textField:shouldChangeCharactersInRange:replacementString:方法。

该方法被调用每个字符的水龙头或前一个字符replace。 在这种方法中,你可以做这样的事情:

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if ([textField.text length] > MAXLENGTH) { textField.text = [textField.text substringToIndex:MAXLENGTH-1]; return NO; } return YES; } 

一个更好的function,正确处理退格和限制字符长度限制如下:

 #define MAXLENGTH 8 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { int length = [textField.text length] ; if (length >= MAXLENGTH && ![string isEqualToString:@""]) { textField.text = [textField.text substringToIndex:MAXLENGTH]; return NO; } return YES; } 

干杯!

此代码限制文本,同时还允许您input字符或粘贴到文本的任何位置。 如果结果文本太长,则会更改范围内的字符,并将结果文本截断为极限。

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSUInteger newLength = [textField.text length] - range.length + [string length]; if (newLength >= MAXLENGTH) { textField.text = [[textField.text stringByReplacingCharactersInRange:range withString:string] substringToIndex:MAXLENGTH]; return NO; } return YES; } 

我认为这个代码会做的伎俩:

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string { if (range.location >= MAX_LENGTH) return NO; return YES; } 

使用这种委托方法,您可以防止用户在文本字段中添加比MAX_LENGTH更多的字符,并且允许用户在需要时input退格。

对我来说,这是做了魔术:

 if (textField.text.length >= 10 && range.length == 0) return NO; return YES; 

我觉得没有这样的财产。

但是分配给UILabel的文本必须是NSString。 并且,在将此string分配给UILabel的文本属性之前,可以使用以下NSString方法在给定索引(最大长度)下裁剪string:

 - (NSString *)substringToIndex:(NSUInteger)anIndex 

这与coneybeare的答案类似,但现在文本字段可以包含最大的MAXLENGTH符号:

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if ([textField.text length] > MAXLENGTH - 1) { textField.text = [textField.text substringToIndex:MAXLENGTH]; return NO; } return YES; } 

这是我如何解决这个问题。 当达到最大限制,它不会尝试添加更多…您将只能删除字符

 (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if ([textfield.text length] > MAX_SIZE && ![string isEqualToString:@""]) { return NO; } } 

您必须了解文本的位置以及添加的文本的长度(以防粘贴多个字符)。 这些关于最大长度的模式是它们的总和不应该超过最大长度。

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSInteger locationAndStringLengthSum = range.location + [string length]; if ([textField isEqual:_expirationMonthField]) { if (locationAndStringLengthSum > EXP_MONTH_FIELD_MAX_CHAR_LENGTH) { return NO; } } else if ([textField isEqual:_expirationYearField]) { if (locationAndStringLengthSum > EXP_YEAR_FIELD_MAX_CHAR_LENGTH) { return NO; } } else if ([textField isEqual:_securityCodeField]) { if (locationAndStringLengthSum > SECURITY_FIELD_MAX_CHAR_LENGTH) { return NO; } } else if ([textField isEqual:_zipCodeField]) { if (locationAndStringLengthSum > ZIP_CODE_MAX_CHAR_LENGTH) { return NO; } } return YES; } 

您需要在ViewDidLoad上分配委托

 TextFieldname.delegate=self