设置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。 如果是,那么有一个简单的方法。
- 实现UITextFieldDelegate协议
- 实现
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