[ios] UITextFieldの最大文字長を設定する


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

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




これは、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;
    }
}



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

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



これにより文字数が制限されますが、最大限までフィールドに貼り付けることもできます。

- (void)textViewDidChange:(UITextView *)textView
{
    NSString* str = [textView text];
    str = [str substringToIndex:MIN(1000,[str length])];
    [textView setText:str];

    if([str length]==1000) {
        // show some label that you've reached the limit of 1000 characters
    }
}



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

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



このコードを使用してくださいRESTRICTED_LENGTHは、テキストフィールドを制限する長さです。

   - (BOOL)textField:(UITextField *)textField     shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField == nameTF) {
    int limit = RESTRICTED_LENGTH - 1;
    return !([textField.text length]>limit && [string length] > range.length);
    }
   else
   {
    return YES;
   }

return NO;

}



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

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



私は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.
}

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




スイフト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
    }

あなたの投票に感謝します。 :)




私はオープンソースのUITextFieldサブクラスであるSTATextFieldを提供しており、 maxCharacterLengthプロパティでこの機能を提供しています。




私はUITextField Extensionを実装して、maxLengthプロパティを追加しました。

これはXcode 6 IBInspectablesに基づいているため、Interface BuilderでmaxLength制限を設定できます。

ここに実装があります:

UITextField + MaxLength.h

#import <UIKit/UIKit.h>

@interface UITextField_MaxLength : UITextField<UITextFieldDelegate>

@property (nonatomic)IBInspectable int textMaxLength;
@end

UITextField + MaxLength.m

#import "UITextField+MaxLength.h"

@interface UITextField_MaxLength()

@property (nonatomic, assign) id <UITextFieldDelegate> superDelegate;

@end

@implementation UITextField_MaxLength

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

    //validate the length, only if it's set to a non zero value
    if (self.textMaxLength>0) {
        if(range.length + range.location > textField.text.length)
            return NO;

        if (textField.text.length+string.length - range.length>self.textMaxLength) {
            return NO;
        }
    }

    //if length validation was passed, query the super class to see if the delegate method is implemented there
    if (self.superDelegate && [self.superDelegate respondsToSelector:@selector(textField:shouldChangeCharactersInRange:replacementString:)]) {
        return [self.superDelegate textField:textField shouldChangeCharactersInRange:range replacementString:string];
    }
    else{
        //if the super class does not implement the delegate method, simply return YES as the length validation was passed
        return YES;
    }
}

- (void)setDelegate:(id<UITextFieldDelegate>)delegate {
    if (delegate == self)
        return;
    self.superDelegate = delegate;
    [super setDelegate:self];
}

//forward all non overriden delegate methods
- (id)forwardingTargetForSelector:(SEL)aSelector {
    if ([self.superDelegate  respondsToSelector:aSelector])
        return self.superDelegate;

    return [super forwardingTargetForSelector:aSelector];
}

- (BOOL)respondsToSelector:(SEL)aSelector {
    if ([self.superDelegate respondsToSelector:aSelector])
        return YES;

    return [super respondsToSelector:aSelector];
}
@end



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

}



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



他の答えでは、ユーザーがクリップボードから長い文字列を貼り付けることはできません。 長い文字列を貼り付けると、切り捨てられて表示されるはずです。 あなたの代理人でこれを使用してください:

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'

}



上記の答えのいくつかの問題は、例えば私はテキストフィールドを持っており、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