有没有办法在UITextField上设置最大长度?
类似于HTML输入字段中的MAXLENGTH属性。
答案 0 :(得分:239)
这适用于退格和复制&粘贴:
#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;
}
UPDATE:已更新,即使在MAXLENGTH时也接受返回键。谢谢罗杰斯先生!
答案 1 :(得分:40)
<强>更新强>
我无法删除此答案,因为它是可接受的答案,但它不正确。以下是从下面的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;
}
<强> ORIGINAL 强>
我认为你的意思是UITextField。如果是,那么有一种简单的方法。
textField:shouldChangeCharactersInRange:replacementString:
方法。在每个字符点击或前一个字符替换时调用该方法。在这种方法中,你可以这样做:
- (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;
}
答案 2 :(得分:16)
正确处理退格并将字符限制为提供的长度限制的更好的函数如下:
#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;
}
干杯!
答案 3 :(得分:11)
此代码限制文本,同时还允许您输入字符或粘贴到文本的任何位置。如果生成的文本太长,则会更改范围中的字符,并将生成的文本截断为限制。
- (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;
}
答案 4 :(得分:4)
我认为这段代码可以解决问题:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString*)string
{
if (range.location >= MAX_LENGTH)
return NO;
return YES;
}
使用此委托方法,您可以阻止用户向文本字段添加比MAX_LENGTH更多的字符,并且如果需要,应允许用户输入退格键。
答案 5 :(得分:2)
对我来说这就是魔术:
if (textField.text.length >= 10 && range.length == 0)
return NO;
return YES;
答案 6 :(得分:2)
这就是我解决这个问题的方法。当达到最大限制时,它不会尝试添加更多...您只能删除字符
#define MAX_SIZE ((int) 5)
...
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if ([textField.text length] >= MAX_SIZE && ![string isEqualToString:@""]) {
return NO;
}
return YES;
}
答案 7 :(得分:1)
我认为没有这样的财产。
但是您分配给UILabel的文本必须是NSString。在将此字符串分配给UILabel的text属性之前,您可以使用以下NSString方法在给定索引处裁剪字符串(您的maxlength):
- (NSString *)substringToIndex:(NSUInteger)anIndex
答案 8 :(得分:1)
这类似于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;
}
答案 9 :(得分:1)
您必须知道文本的放置位置以及添加的文本长度(如果它们粘贴多个字符)。这些与最大长度之间的模式是它们的总和不应超过最大长度。
- (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;
}
答案 10 :(得分:-3)
您需要在ViewDidLoad
TextFieldname.delegate=self