ホーム > 開発 > UITextFieldの入力文字数を制限する

UITextFieldの入力文字数を制限する

ユーザに文字入力して貰う時に、最大文字数で制限したい時があります。
残念ながらUITextFieldには、maxTextLengthみたいな名前のプロパティはありません。

このような場合、UITextFieldDelegateのtextField:shouldChangeCharactersInRange:replacementString:を使う事ができます。
文字入力やバックスペースが入った時、カットやペーストを行った時に、rangeに置き換え範囲、stringに置き換え文字列が渡ってきます。
現在のテキストに対して置換を実行してやれば入力確定後の文字列が得られるので、文字数をチェックして受け入れるか拒否します。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSMutableString *text = [[textField.text mutableCopy] autorelease];
    [text replaceCharactersInRange:range withString:string];
    return [text length] < <最大文字数>
}

文字数のチェックにlengthを使っていますが、これはサロゲートペアを処理しないので、見た目の文字数でチェックしたい場合はグリフを数えてください。

問題点

実は日本語環境では問題があります。予測変換で単語を選択入力すると、textField:shouldChangeCharactersInRange:replacementString:が発生しません。キーボードから文字を入れた時のみ発生するようです。
そのため、パスワード入力とか日本語キーボードを禁止している時しか当てになりません。
iPhone OSのバグのような気もしますね。
現状、文字の切り落としを併用して対処しています。

広告
カテゴリー:開発 タグ: ,
  1. まだコメントはありません。
  1. No trackbacks yet.

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。