ios uitextview 文字数 - UITextFieldの最大文字長を設定する





15 Answers

ありがとうございました! ( Post

これは私が動作したコードです:

#define MAX_LENGTH 20

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField.text.length >= MAX_LENGTH && range.length == 0)
    {
        return NO; // return NO to not change text
    }
    else
    {return YES;}
}
制限 swift4 文字数制限

UIViewを読み込むと、iPhone SDK上のUITextFieldに最大文字数を設定するにはどうすればよいですか?




8月の回答を完了するために、提案された関数の実装が可能です( UITextFieldのデリゲートを参照してください)。

私はドームコードをテストしませんでしたが、ユーザが限界に達した場合に私が立ち往生することはなく、より小さいか等しいものを置き換える新しい文字列と互換性があります。

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    //limit the size :
    int limit = 20;
    return !([textField.text length]>limit && [string length] > range.length);
}



しばしば、異なる長さの複数の入力フィールドがあります。

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



私はthis UITextFieldLimitサブクラスを作成しました:

  • 複数のテキストフィールドがサポートされています
  • テキストの長さの制限を設定する
  • ペースト防止
  • テキストフィールド内の左の文字のラベルを表示し、編集を終了すると非表示になります。
  • 文字が残っていないときにアニメーションを振る。

このGitHubリポジトリからUITextFieldLimit.hUITextFieldLimit.mします。

this

テストを開始する!

ストーリーボードで作成したUITextFieldをマークし、アイデンティティ・インスペクタを使用してサブクラスにリンクします。

次に、IBOutletにリンクして制限値を設定します(デフォルトは10です)。

あなたのViewController.hファイルには次のものが含まれていなければなりません:(もしあなたが限界のように設定を変更したくないなら)

#import "UITextFieldLimit.h"

/.../

@property (weak, nonatomic) IBOutlet UITextFieldLimit *textFieldLimit; // <--Your IBOutlet

ViewController.mファイルは@synthesize textFieldLimit @synthesizeする必要があります。

ViewController.mファイルにテキストの長さ制限を設定します。

- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

    [textFieldLimit setLimit:25];// <-- and you won't be able to put more than 25 characters in the TextField.
}

クラスがあなたに役立つことを願っています。 がんばろう!




私は実際の文字列の置換をシミュレートし、その文字列の将来の長さを計算しようとしています。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];

    if([newString length] > maxLength)
       return NO;

    return YES;
}



Interface builderを使用すると、あなたの関数の中で "Editing changed"のイベントをリンクして取得できます。 今そこに長さのチェックを入れることができます

- (IBAction)onValueChange:(id)sender 
{
    NSString *text = nil;
    int MAX_LENGTH = 20;
    switch ([sender tag] ) 
    {
        case 1: 
        {
            text = myEditField.text;
            if (MAX_LENGTH < [text length]) {
                myEditField.text = [text substringToIndex:MAX_LENGTH];
            }
        }
            break;
        default:
            break;
    }

}



任意の長さの文字列を切り取って貼り付けるには、関数を次のように変更することをお勧めします。

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



Swift 2.0 +

まず、このプロセスのためのクラスを作成します。 それをStringValidator.swiftと呼ぶことができます。

次に、その中に次のコードを貼り付けます。

import Foundation

extension String {

func containsCharactersIn(matchCharacters: String) -> Bool {
let characterSet = NSCharacterSet(charactersInString: matchCharacters)
return self.rangeOfCharacterFromSet(characterSet) != nil
}

func containsOnlyCharactersIn(matchCharacters: String) -> Bool {
let disallowedCharacterSet = NSCharacterSet(charactersInString: matchCharacters).invertedSet
return self.rangeOfCharacterFromSet(disallowedCharacterSet) == nil
}


func doesNotContainCharactersIn(matchCharacters: String) -> Bool {
let characterSet = NSCharacterSet(charactersInString: matchCharacters)
return self.rangeOfCharacterFromSet(characterSet) == nil
}

func isNumeric() -> Bool
{
let scanner = NSScanner(string: self)
scanner.locale = NSLocale.currentLocale()

return scanner.scanDecimal(nil) && scanner.atEnd
}

}

今クラスを保存する.....

使用法..

今あなたのviewController.swiftクラスに行き、あなたのテキストフィールドのアウトレットを作る..

@IBOutlet weak var contactEntryTxtFld: UITextField! //First textfield
@IBOutlet weak var contactEntryTxtFld2: UITextField!   //Second textfield

次に、テキストフィールドのshouldChangeCharactersInRangeメソッドに移動し、次のように使用します。

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    if string.characters.count == 0 {
        return true
    }
    let latestText = textField.text ?? ""
    let checkAbleText = (latestText as NSString).stringByReplacingCharactersInRange(range, withString: string)


    switch textField {

    case contactEntryTxtFld:
        return checkAbleText.containsOnlyCharactersIn("0123456789") && prospectiveText.characters.count <= 5

    case contactEntryTxtFld2:
        return checkAbleText.containsOnlyCharactersIn("0123456789") && prospectiveText.characters.count <= 5

    default:
        return true
    }

}

テキストフィールドのデリゲートプロトコル/メソッドを設定することを忘れないでください。

私はこれについて説明しましょう...私は別のクラスの中で書いた文字列の単純な拡張プロセスを使用しています。 今私はチェックと最大値を追加することによってそれらの拡張メソッドを必要とする別のクラスからそれらの拡張メソッドを呼び出すだけです。

特徴...

  1. 特定のテキストフィールドの最大限度を設定します。
  2. それは特定のテキストフィールドのために受け入れられたキーのタイプを設定します。

タイプ...

containsOnlyCharactersIn //文字のみを受け入れます。

containsCharactersIn //文字の組み合わせを受け入れる

doesNotContainsCharactersIn //文字を受け付けません

ホープこれは助け....ありがとう..




これは、UITextFieldの最大長を処理する正しい方法です。最初のレスポンダとしてテキストフィールドを終了してリターンキーを終了させ、ユーザがリミットに達するとバックスペースを許可します

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
int MAX_LENGHT = 5;
    if([string isEqualToString:@"\n"])
    {
        [textField resignFirstResponder];
        return FALSE;
    }
    else if(textField.text.length > MAX_LENGHT-1)
    {
        if([string isEqualToString:@""] && range.length == 1)
        {
            return TRUE;
        }
        else
        {
            return FALSE;
        }
    }
    else
    {
        return TRUE;
    }
}



スウィフト4

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard let text = textField.text else { return true }
    let newLength = text.count + string.count - range.length
    return newLength <= 10
}



1行のコードになっています:)

あなたのテキストビューのデリゲートを "self"に設定し、.hとあなたの.mの中の次のコードに<UITextViewDelegate>追加します。あなたはあなたのMAXIMUMの数を望むものになるように数字 "7"を調整できますさあ。

-(BOOL)textView:(UITextView *)a shouldChangeTextInRange:(NSRange)b replacementText:(NSString *)c {
    return ((a.text.length+c.length<=7)+(c.length<1)+(b.length>=c.length)>0);
}

このコードは、新しい文字の入力、文字の削除、文字の選択、入力または削除、文字の選択と切り取り、一般的な貼り付け、および文字の選択と貼り付けを行います。

完了!





別の方法として、このコードをビット操作で書く別のクールな方法は、

-(BOOL)textView:(UITextView *)a shouldChangeTextInRange:(NSRange)b replacementText:(NSString *)c {
    return 0^((a.text.length+c.length<=7)+(c.length<1)+(b.length>=c.length));
}



あなたが値を与えたいだけの文字がいくつありますか?

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range   replacementString:(NSString *)string {
     NSUInteger newLength = [textField.text length] + [string length] - range.length;
     return (newLength > 25) ? NO : YES;
  }



私は番号パッドを使用するときに8文字の制限のためにスウィフトでこれを行いました。

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    return !(textField.text?.characters.count == MAX_LENGTH && string != "")
}

私は文字列をテストしなければならなかった!= ""削除ボタンが数字パッドで機能するようにしなければなりませんでした。そうしないと、テキストフィールドの文字を最大値に達した後で削除できません。




@Frouoに基づいて補足的な答えを出します。 私は彼の答えが最も美しい方法だと思う。 それを再利用できる共通のコントロールにしてください。

private var kAssociationKeyMaxLength: Int = 0

extension UITextField {

    @IBInspectable var maxLength: Int {
        get {
            if let length = objc_getAssociatedObject(self, &kAssociationKeyMaxLength) as? Int {
                return length
            } else {
                return Int.max
            }
        }
        set {
            objc_setAssociatedObject(self, &kAssociationKeyMaxLength, newValue, .OBJC_ASSOCIATION_RETAIN)
            self.addTarget(self, action: #selector(checkMaxLength), for: .editingChanged)
        }
    }

    func checkMaxLength(textField: UITextField) {

        guard !self.isInputMethod(), let prospectiveText = self.text,
            prospectiveText.count > maxLength
            else {
                return
        }

        let selection = selectedTextRange
        let maxCharIndex = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
        text = prospectiveText.substring(to: maxCharIndex)
        selectedTextRange = selection
    }

    //The method is used to cancel the check when use Chinese Pinyin input method.
    //Becuase the alphabet also appears in the textfield when inputting, we should cancel the check.
    func isInputMethod() -> Bool {
        if let positionRange = self.markedTextRange {
            if let _ = self.position(from: positionRange.start, offset: 0) {
                return true
            }
        }
        return false
    }

}



上記の答えのいくつかの問題は、例えば私はテキストフィールドを持っており、15文字の入力制限を設定しなければならない、そしてそれは15文字を入力した後に停止する。 削除することはできません。 つまり、削除ボタンも機能しません。 私は同じ問題に直面していました。 解決策を考えてみましょう。 私にとって完璧な作品

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
 if(textField.tag==6)
 {
    if ([textField.text length]<=30)
    {
        return YES;   
    }
    else if([@"" isEqualToString:string])
    {
        textField.text=[textField.text substringToIndex:30 ];
    }

    return NO;
 }
 else
 {
    return YES;
 }
}

私は "6"と私は最大文字の制限を制限しているタグを設定したテキストフィールドを持っている= 30; すべての場合にうまく動作します




Related