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になります。見づらいですがボタンの文字が灰色ではなく、水色になっています。