iPhoneのvalidation試しました
iPhoneのTextFieldにValidationしたいとです。
やりたいこと
- 編集可能なTextFiledを表示、いわゆるuserIDが入力される想定
- TextFieldには4文字以上、6文字以内の半角文字列(ASCII)だけが妥当であると判定したい
- submit用のボタンを表示
- 妥当であると判定されたらsubmit用ボタンを押せるようにする
- 妥当でない場合はsubmitボタンを無効にする
UIControlEventEditingChangedを利用する
UIControl Class ReferenceによるとTexiFieldを編集したというイベントを検知できるらしい
UIControlEventEditingDidBegin A touch initiating an editing session in a UITextField object by entering its bounds. Available in iOS 2.0 and later. Declared in UIControl.h.
作戦
半角文字の判定
半角文字列の判定はカヤックの人のブログを見る限り面倒
http://d.hatena.ne.jp/shu223/20110219/1299330910
なので素直に次のような正規表現を用いる事にしました。userIDのように日本語を想定しない場合はこれで良いはず。
日本語のvalidationは本当に必要になってから考えます。
NSRange match = [textField.text rangeOfString:@"^[a-zA-Z0-9]{4,6}$" options:NSRegularExpressionSearch];
入力するたびにvalidation
入力語に値を書き換える直前に呼ばれるメソッドもあるようです。このメソッドを使うと制限文字数を超えた入力を許可しない、といった事もできそうです。
- (NSString *)stringByReplacingCharactersInRange:(NSRange)range withString:(NSString *)replacement
ただし、次のBLOGによると端末を振る事によって発生するUNDOではこのメソッドが呼ばれません。
http://dev.elegant-apps.com/blog/archives/2011/01/06/textfield-validation.html
という事で入力後に常に値をチェックするようにします。
実装
上記の判定を文字が入力された直後に、都度、読み込む。
私はIBを使わないのでloadViewに以下の処理を記述しました。
UITextField * textField; textField = [[UITextField alloc] init]; textField.frame = CGRectMake( 20, 100, 280, 30 ); textField.borderStyle = UITextBorderStyleRoundedRect; textField.placeholder = @"IDを入力した下さい。"; textField.delegate = self; [textField addTarget:self action:@selector(textFieldEditingChanged:) forControlEvents:UIControlEventEditingChanged]; [self.view addSubview:textField]; [textField release];
UIControlEventEditingChangedのイベントが発生するたびに、textFieldEditingChanged:(UITextField*)textFieldが実行されます。
こんな感じ
TextFieldに格納されている値がまだ妥当ではないのでenabled=NOになっています。
わかりやすくするため文字を灰色にしました。
入力
妥当な文字であればenabled=YESになります。見づらいですがボタンの文字が灰色ではなく、水色になっています。