iOS – UITextFieldやUITextViewで入力文字数を制限する方法

入力制限

UITextFieldやUITextViewで入力できる最大文字数を指定する方法を紹介します。

UITextFieldの場合

UITextFieldのshouldChangeCharactersInRangeデリゲートメソッドを利用します。このメソッドはファーストレスポンダになっているUITextFieldに1文字でも入力があれば呼び出されます。このメソッド内において入力された文字が最大文字数を超えていないかチェックします。

尚、お決まりですが、このデリゲートメソッドを使用するためにはUITextFieldDelegateプロトコルを当該ViewControllerで採用し、デリゲート先をそのViewControllerにする必要があります。

実装例は以下の通りです。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{    
    // 最大入力文字数
    int maxInputLength = 200;

    // 入力済みのテキストを取得
    NSMutableString *str = [textField.text mutableCopy];

    // 入力済みのテキストと入力が行われたテキストを結合
    [str replaceCharactersInRange:range withString:string];

    if ([str length] > maxInputLength) {
        // ※ここに文字数制限を超えたことを通知する処理を追加

        return NO;
    }

    return YES;
}

上記のコードを解説します。まず、7行目でファーストレスポンダになっているUITextFieldから既に入力済みの文字列を取得します。これにはこのデリゲートが呼び出されるきっかけとなった入力は含まれていません。きっかけとなった入力はreplacementStringに格納されています。

10〜12行目の部分では、これら2つの文字列を結合し、その文字列の長さが許容されている範囲を超えていないかチェックして、返す戻り値を変えています。このデリゲートメソッドがYESを返せば直前の入力がUITextFieldに反映されますが、NOを返した場合は反映されません

 

UITextViewの場合

UITextFieldの場合とほとんど同じですが、デリゲートメソッド名や採用するプロトコルが異なります。UITextViewではshouldChangeTextInRangeデリゲートメソッドを利用し、当該ViewControllerではUITextViewDelegateプロトコルを採用します。

以下、実装例です。

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    int maxInputLength = 2000;

    // 入力済みのテキストを取得
    NSMutableString *str = [textView.text mutableCopy];

    // 入力済みのテキストと入力が行われたテキストを結合
    [str replaceCharactersInRange:range withString:text];

    if ([str length] > maxInputLength) {
        return NO;
    }

    return YES;
}

 

複数のUITextFieldがある場合はどうするか tag_value_on_attribute_inspector

UITextFieldが複数あり、それぞれ最大入力文字数が異なる場合はUITextFieldに異なるtag値を設定し、そのtag値でどのUITextFieldなのかを判定して処理を行うのが簡単だと思います。tag値は右図のようにStoryboard上のAttribute Inspectorで編集できます。

以下に実装例を載せます。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    // 最大入力文字数
    int maxInputLength = 50;
    switch (textField.tag) {
        case 1: // 名前
            maxInputLength = 50;
            break;
        case 2: // 住所
            maxInputLength = 200;
            break;
        case 3: // 年齢
            maxInputLength = 3;
            break;

        default:
            break;
    }

    // 入力済みのテキストを取得
    NSMutableString *str = [textField.text mutableCopy];

    // 入力済みのテキストと入力が行われたテキストを結合
    [str replaceCharactersInRange:range withString:string];

    if ([str length] > maxInputLength) {
        return NO;
    }

    return YES;
}

上記のコードは「名前」「住所」「年齢」の3つのUITextFieldにそれぞれtag値として1, 2, 3を割り振った場合の実装例です。

 

環境

XCode 4.6.1