3

Josh がこの質問で説明した方法を使用して、iPhone のキーボードの上部にツールバーを追加しています。基本的に、アイデアは次のとおりです。

  • View Controller を通知のオブザーバーとして追加しUIKeyboardWillShowNotificationUIKeyboardWillHideNotificationその初期化メソッドに追加します
  • これらの通知が投稿されるたびに、キーボードと一緒にツールバーを画面に表示/非表示にアニメーション化します

画面には複数の UITextFields もあり、編集のために選択するとすべてがファーストレスポンダーになり、編集が完了するとファーストレスポンダーを辞任します (ユーザーが別のテキストフィールドをタップするか、任意のテキストフィールドから離れるか、キーボードの「完了」を押します)。 - にtextFieldShouldReturn:オーバーライドしましたresignFirstResponder)。

ただし、テキスト フィールドを切り替えるたびに通知が投稿されるため、問題が発生しています。たとえば、ユーザーがテキスト フィールド A の編集を終了し、テキスト フィールド B をタップした場合、A はファーストレスポンダーを辞任し、B はファーストレスポンダーになります。ただし、これにより、「表示される」通知と「非表示になる」通知の両方がView Controllerに投稿されます。

これらすべての最終結果は、ツールバーが最初のテキスト フィールドのキーボードで表示され、最後のテキスト フィールドのキーボードで非表示になる間、ユーザーがテキストを切り替えるたびにキーボードにスライドして戻ってくるように見えることです。田畑。

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

4

2 に答える 2

4

リードの答えをフォローアップするには:次の実装を使用して終了しました。BOOLコントローラーがtextFieldShouldBeginEditing:とメッセージの間にあるかどうかを追跡するために を使用しtextFieldDidBeginEditing:、現在編集中のテキスト フィールドを追跡するために 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];
}
于 2009-07-10T04:54:20.907 に答える
4

キーボードが既に表示されているかどうかを追跡するために BOOL ivar を作成する必要があるため、すべての UITextField デリゲート メソッドを有効に活用できます:) 複数のテキスト フィールドを持つツールバーは扱いにくい場合がありますが、非常に近い!

于 2009-07-10T03:59:17.663 に答える