2010-03-26 152 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; 
}