設置UITextField的最大字符長度

加載UIView時,如何在iPhone SDK的UITextField設置最大字符數? 函數


#1樓

這應該足以解決問題(將4替換爲您想要的限制)。 只要確保在IB中添加委託便可。 spa

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
     NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
     return (newString.length<=4);
}

#2樓

一般,您有多個長度不一樣的輸入字段。 code

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    int allowedLength;
    switch(textField.tag) {
        case 1: 
            allowedLength = MAXLENGTHNAME;      // triggered for input fields with tag = 1
            break;
        case 2:
            allowedLength = MAXLENGTHADDRESS;   // triggered for input fields with tag = 2
            break;
        default:
            allowedLength = MAXLENGTHDEFAULT;   // length default when no tag (=0) value =255
            break;
    }

    if (textField.text.length >= allowedLength && range.length == 0) {
        return NO; // Change not allowed
    } else {
        return YES; // Change allowed
    }
}

#3樓

爲了使它能夠剪切和粘貼任何長度的字符串,我建議將函數更改成: ci

#define MAX_LENGTH 20

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        NSInteger insertDelta = string.length - range.length;

        if (textField.text.length + insertDelta > MAX_LENGTH)
        {
           return NO; // the new string would be longer than MAX_LENGTH
        }
        else {
            return YES;
        }
    }

#4樓

其餘答案不能解決用戶能夠從剪貼板粘貼長字符串的狀況。 若是我粘貼了一個長字符串,則應該將其截短但要顯示出來。 在您的表明中使用此命令: 字符串

static const NSUInteger maxNoOfCharacters = 5;

-(IBAction)textdidChange:(UITextField * )textField
{
NSString * text = textField.text;

if(text.length > maxNoOfCharacters)
{
    text = [text substringWithRange:NSMakeRange(0, maxNoOfCharacters)];
    textField.text = text;
}

// use 'text'

}

#5樓

雖然UITextField類沒有max length屬性,可是經過設置文本字段的delegate並實現如下委託方法來得到此功能相對簡單: input

目標C string

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    // Prevent crashing undo bug – see note below.
    if(range.length + range.location > textField.text.length)
    {
        return NO;
    }

    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return newLength <= 25;
}

迅速 it

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    let currentCharacterCount = textField.text?.count ?? 0
    if range.length + range.location > currentCharacterCount {
        return false
    }
    let newLength = currentCharacterCount + string.count - range.length
    return newLength <= 25
}

在文本字段更改以前,UITextField詢問委託是否更改指定的文本。 此時,文本字段還沒有更改,所以咱們將獲取當前長度和要插入的字符串長度(經過粘貼複製的文本或使用鍵盤鍵入單個字符)減去範圍長度。 若是此值太長(在此示例中,該長度超過25個字符),則返回NO以禁止更改。 io

在文本字段的末尾鍵入單個字符時, range.location將是當前字段的長度,而range.length將是0,由於咱們沒有替換/刪除任何內容。 插入文本字段的中間僅表示不一樣的range.location ,而粘貼多個字符僅表示string包含多個字符。 event

刪除單個字符或剪切多個字符由長度不爲零的range和空字符串指定。 替換隻是使用非空字符串的範圍刪除。

關於崩潰的「撤消」錯誤的說明

如評論中所述, UITextField存在一個錯誤,可能致使崩潰。

若是您粘貼到該字段中,可是您的驗證明現阻止粘貼,則粘貼操做仍會記錄在應用程序的撤消緩衝區中。 若是隨後觸發撤消操做(經過搖動設備並確認撤消操做),則UITextField將嘗試用空字符串替換它認爲粘貼至其自身的字符串。 這將崩潰,由於它從未真正將字符串粘貼到自身中。 它將嘗試替換不存在的字符串的一部分。

幸運的是,您能夠像這樣保護UITextField避免殺死本身。 您只須要確保它建議替換的範圍確實存在於當前字符串中便可。 這就是上面的初始完整性檢查所作的。

迅速3.0與複製和粘貼工做正常。

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        let str = (textView.text + text)
        if str.characters.count <= 10 {
            return true
        }
        textView.text = str.substring(to: str.index(str.startIndex, offsetBy: 10))
        return false
    }

但願對您有幫助。

相關文章
相關標籤/搜索