2010-03-26 111 views

回答

230

这与退格键工作正常,并复制&粘贴:

#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时也接受返回键。谢谢罗杰斯先生!

+13

这个答案是伟大的粘贴一串更长 –

+1

这个答案是唯一一个当用户试图粘贴一个长字符串时真正起作用的答案。请注意! – JosephH

+0

+1,代码非常清晰。 – PEZ

39

UPDATE

,因为它是公认的,但它是不正确的,我不能删除这个答案。下面是正确的代码,请从下方托马复制:

#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。如果是的话,那么有一个简单的方法。

  1. 贯彻UITextFieldDelegate协议
  2. 贯彻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; 
} 
+1

是的我的意思是UITextField,我编辑了我的问题。 我知道了。感谢您的回答。这个对我有用 ! – Elegya

+1

您还需要将适当的委托分配给de UITextField。 – Ecarrion

+11

这是有点瑕疵:1)通过检查现有的现场文本长度(而不是提出新的长度),你让用户去1个字符超出最大,和2)它不会阻止拷贝和粘贴用户。更多的文本中 –

1

我认为没有这样的属性。

但是,您分配给UILabel的文本必须是NSString。你这个字符串分配给UILabel的文本属性才可以例如使用NSString以下方法给定索引(你最大长度)在裁剪的字符串:

- (NSString *)substringToIndex:(NSUInteger)anIndex 
+1

不幸的是,问题提问者改变了他们的问题,你回答后,让你的答案不再让任何意义:( – JosephH

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; 
    } 

干杯!

+2

我相信你不需要串文本字段 – Ecarrion

+0

这个工作对我来说:)谢谢 – Peter

+4

这其中并不妨碍好得多当用户粘贴比最大值更长的字符串时,长度会超过最大值。 – JosephH

4

我觉得这个代码会做的伎俩:

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

与此委托方法可以防止用户超过MAX_LENGTH更多的字符添加到您的文本字段,用户应该被允许进入退格键如果需要的话。

+0

这并不完全覆盖用户粘贴的情况;它允许字符串变得太长。当用户超过1 – JosephH

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; 
} 
+0

这其中并不妨碍长度会超过最大。比公认的好。 – Shebuka

2

对我来说这确实神奇:

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

您需要在ViewDidLoad

TextFieldname.delegate=self 
+2

这不是一个完整的答案。代表的实施将更加有趣。 –

1

我这是怎么解决这个问题分配委托。当达到最大限制它不会尝试添加更多...你将只能删除字符

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