textFieldに入力値の妥当性をチェックする機能を作った際に心がけたことを自分用メモとして。。
結論
想定外の値が入力された場合に、その値をきちんとシステムから除外してあげる仕組みを作ること
概要
たまたま作っていたiOSアプリに税率を入力する機能を実装することになった。厳密に正規表現で書いても実現はできたが、もっとシンプルに作れないかと考えた。正規表現が嫌いなわけではない。
A. 入力モード : 数字のみ
まず、Objective-Cにはキーボードを文字入力、数字の入力などに切り替えることができる。当然数字のみ入力できるモードも存在する。ここでは数字のみの入力モードを使用する。
sample.m
self.txtfield = [[UITextField alloc] initWithFrame:CGRectMake(XX, XX, XX, XX)];
self.txtfield.keyboardType = UIKeyboardTypeNumberPad
とした。
B. 桁数制限
3桁も考えたが、税率が100%はありえないため、桁数を2桁まで入力できるように制御するようにした。
sample.m
- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
// 最大文字列長を2桁に設定する
NSInteger maxLength = 2;
self.txtfield = [self.txtfield stringByAppendingString:string];
return [[self.txtField.text stringByReplacingCharactersInRange:range withString:string] length] <= maxLength;
}
C. 不正文字の除去
あとは、入力される文字に不正な文字列が混入しないかを考慮すれば良い。
2桁かつ先頭に0が付くものを除外する。
sample.m
if (valid) {
BOOL valid = [self.saleField.text hasPrefix:@"0"];
if ([self.txtField.text length] == 2) {
self.txtField.text = [self.txtField.text substringFromIndex:1];
}
}
ポイント
- 入力モードを数字のみにする
- 文字列長のチェック
- 不正文字への考慮
備考
実装するバリデータの役割に対してやることを予め書き出しておくとスムーズに実装できる。その際には考慮もれが無いようにデータパターンを洗い出しておく必要がある。