UITextFieldに入力されている文字数を動的に、非同期に数える。
- 平成22年3月3日(水) 11時06分22秒
- 区分
- objective-c
- 報告者:
- masuda
2週間連続で原稿を落としたmasudaです。
こんにちは。
あまりググればわかるということは書きたくはないなと思っているので、なかなかネタを見つけるのは難しいです。
今回はiPhoneアプリを書いているときにはまったところで、ググってもなかなか答えが見つからないことを書きたいと思います。
2つあるので2週間はこれで持つ!
とあるUITextFieldによる入力フォームと、UIBarButtonItemによる「完了」ボタンがある画面を考えます。
今回のエントリの目的はUITextFieldに文字が入力されていない、つまり空であるときは、「完了」ボタンを表示しない画面を作成するということです。
ポイントはUIControlEventEditingChangedイベントを使うこと。
最初はUITextFieldDelegateのtextField:shouldChangeCharactersInRange:replacementString:とかを使用することを考えましたが、文字を消去したときにボタンが消えない等々うまくいきませんでした。
サンプルコードを書いてみます。
- (void)setupUserInterface
{
UIView *contentView;
UITextField *textField;
contentView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self setView:contentView];
[contentView release];
doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
target:self
action:@selector(respondsToDoneButtonTouchDown:)];
textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];
[contentView addSubview:textField];
[textField release];
[textField addTarget:self
action:@selector(respondsToEditingChanged:)
forControlEvents:UIControlEventEditingChanged];
}
- (void)respondsToEditingChanged:(id)sender
{
if ([sender isKindOfClass:[UITextField class]])
{
// 本当はsenderを用いずにメンバ変数とかにしておけばいいのだけれど、今回はあえて型変換をしてみる。
if ([[(UITextField *)sender text] length])
{
[[self navigationItem] setRightBarButtonItem:doneButton animated:YES];
}
else
{
[[self navigationItem] setRightBarButtonItem:nil animated:YES];
}
}
}
参考
Disable button if textField is empty - iPhone SDK Development