2012年10月14日 日曜日 HOME > Objective-C
【Objective-C】iOS 6でUIControlEventEditingChangedの挙動が変わった

iOS 6.0では、任意のUITextFieldを編集中に、内容が変わると呼ばれる、 UIControlEventEditingChanged の挙動が変わっていました。
iOS 5.1まではUITextFieldの編集中に、プログラム側からテキスト内容を変更しても UIControlEventEditingChanged が呼ばれましたが、iOS 6.0では、プログラム側でのテキスト内容変更において、このイベントが呼ばれなくなっていました。
//新規プロジェクトで試せる簡単なサンプル
- (void)editingChanged:(id)sender
{
NSLog(@"editingChanged");
}
- (void)onTap:(id)sender
{
UITextField *tf = (UITextField *)[self.view viewWithTag:10];
tf.text = [NSString stringWithFormat:@"%@ tap", tf.text];
//iOS 5.1までは編集中であればこの後にeditingChangedが呼ばれる
}
- (void)viewDidLoad
{
[super viewDidLoad];
UITextField *tf = [[UITextField alloc] initWithFrame:CGRectMake(10.0, 10.0, 300.0, 30.0)];
tf.tag = 10;
tf.text = @"";
tf.borderStyle = UITextBorderStyleRoundedRect;
[tf addTarget:self action:@selector(editingChanged:) forControlEvents:UIControlEventEditingChanged];
[self.view addSubview:tf];
//適当に文字を追加していくボタン
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(10.0, 50.0, 100.0, 50.0);
[btn setTitle:@"Tap" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(onTap:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
[tf becomeFirstResponder];
}
メモアプリなど、編集中にボタン等のアクションでプログラム側からテキスト内容を変換・追加・削除等を行うタイプで、常にこのイベントハンドラで変更を監視し、記述内容の保存(セーブ)処理などを行っていた場合は、注意が必要そうです。