2009-07-10 6 views
3

私は、iPhoneのキーボードの上部にツールバーを追加するには、this questionのJoshに記載されている方法を使用しています。基本的には、アイデアは次のとおりです。最初のレスポンダの変更により、iPhoneキーボードのツールバーが表示されるようにしますか?

  • これらの通知が掲載されているときはいつもと一緒に/画面のオフツールバーをアニメーション化し、その初期化メソッド
  • で通知UIKeyboardWillShowNotificationUIKeyboardWillHideNotificationのためのオブザーバーとしてビューコントローラを追加します。キーボード

私はまた、ユーザーが任意のテキストフィールドオフ、別のテキストフィールドをタップするか、のどちらか(編集のために選択したときにファーストレスポンダになってすべてが画面上に複数のUITextFieldsを、持っていると編集が完了したときに最初の応答者を辞任キーボードの「完了」を押す - 私は01を持っていますはresignFirstResponderに上書きされます)。

テキストフィールド間を切り替えるたびに通知がポストされているので、問題があります。たとえば、ユーザーがテキストフィールドAを編集していて、テキストフィールドAを編集し、テキストフィールドBをタップすると、Aは最初のレスポンダを辞退し、Bは最初のレスポンダになります。しかし、これはまた、「表示される」と「非表示になる」の両方の通知をView Controllerに通知します。

最終的な結果は、ツールバーが最初のテキストフィールドのキーボードで表示され、最後のテキストフィールドのキーボードで消えてしまう間に、ツールバーがユーザーはテキストフィールド間を切り替えます。

キーボードがの場合、実際にが表示または非表示になる場合、「will {show、hide}」通知にのみ応答する方法はありますか?別の言い方をすれば、キーボードの可視状態が変化しない通知を無視するにはどうすればよいですか?

答えて

4

キーボードが既に表示されているかどうかを確認するには、BOOL ivarを作成する必要があります。そのため、すべてのUITextFieldデリゲートメソッドを有効に使います:)複数のテキストフィールドを持つツールバーは、あなたはとても近いです!

+0

! – Tim

+0

ええ、それは痛みです。最近、キーボードの上にツールバーが表示され、ハッキングを止めて機能させていきます。 –

4

Reedの回答をフォローアップするには、以下の実装を使用して巻き上げました。コントローラーがtextFieldShouldBeginEditing:textFieldDidBeginEditing:メッセージの間にあるかどうかを追跡するためにBOOLを使用し、現在編集中のテキストフィールドを追跡するivarも使用します。

実装では、適切なプロパティと@synthesizeのマーカーを持つインタフェースがあると想定しています。 MyKeyboardToolbarは、独自のボタンを作成するためのカスタマイズされた初期化子を持つUIToolbarのサブクラスです。

BOOL shouldBeginEditing; 
UITextField *editingField; 
MyKeyboardToolbar *keyboardBar;

とコード自体:私は種類のそれはそれに来ないだろう:)感謝を期待していた

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    // Give up first responder so the keyboard goes away 
    [textField resignFirstResponder]; 

    return YES; 
} 

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { 
    self.shouldBeginEditing = YES; 
    return YES; 
} 

- (void)textFieldDidBeginEditing:(UITextField *)textField { 
    self.shouldBeginEditing = NO; 
    self.editingField = textField; 
} 

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField { 
    // Do things here with the edited data (e.g. save it somewhere) 

    return YES; 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField { 
    self.editingField = nil; 
} 

// These methods are added as the observers to the notification center 
- (void)keyboardWillShow:(NSNotification *)notification { 
    if(self.keyboardBar == nil) { 
     // Create and show the keyboard toolbar 
    } 
} 

- (void)keyboardWillHide:(NSNotification *)notification { 
    if(![self shouldBeginEditing]) { 
     // Animate the bar off the screen, if necessary 

     // Remove and dispense of the bar entirely 
     [self.keyboardBar removeFromSuperview]; 
     self.keyboardBar = nil; 
    } 
} 

// This method's selector is given to the keyboard toolbar's Done button 
- (void)didPressKeyboardBarDoneButton { 
    [self.editingField resignFirstResponder]; 
}
+0

このフォローアップを投稿していただきありがとうございます。私が似たような状況にあったので、とても役に立ちました。 – Luke

関連する問題