1

カスタム ビュー クラスを持つ ViewController が 1 つあります。viewWillAppear メソッドに追加してキーボード通知を処理し、viewDidDisappear で通知を削除しました。

viewWillAppear に追加する通知:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector (keyboardWillShow:)
                                             name: UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector (keyboardWillHide)
                                             name: UIKeyboardWillHideNotification object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector (keyboardDidHide)
                                             name: UIKeyboardDidHideNotification object:nil];

viewDidDisappear への通知を削除します。

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object: nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object: nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object: nil];

そして、viewController の通知メソッドからビューのメソッドを呼び出します。

問題:

  • UITextField をタップすると、キーボードが表示され、適切にアニメーションが行われます
  • ただし、キーボードが表示された後、ユーザーがナビゲーションバーから戻るボタンを押すと、ViewController が画面から消えた後、キーボードは削除されません。
  • 現在、ユーザーはキーボードを閉じることができません

通知コードを削除すると、完全に機能しました。

iOS 7.0 より前では、通知コードで完全に機能します。しかし、iOS 7.0 では機能しません。

各通知メソッドで NSLog を印刷しました。IOS 7.0 では、keyboardWillShow メソッドが最後に実行され、再びキーボードが表示されます。しかし、iOS 6.0 では、keyboardWillShow はついに実行されません。

UITextFieldDelegate メソッドも実装しています。

前もって感謝します

4

1 に答える 1

1

以下では、firstResponder となる textField/textView を使用して保持された (pop 後に解放されない) プッシュされた viewController のキーボード ライフ サイクルの違いを確認できます。

次のようにキーボードオブザーバーを追加しましょう

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
}

- (void) viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil];
}    

iPhone 5 の iOS6 キーボードのライフサイクル

  • ビューが表示されます:
  • [YourTextField becomeFirstResponder]
  • キーボードウィルショー: キーボードフレーム = {0, 306, 320, 262}

  • [戻るボタンがタップされました]

  • キーボードウィルハイド: キーボードフレーム = {320, 306, 320, 262}
  • viewDidDisappear:

  • [既存のView Controllerをプッシュ]

  • ビューが表示されます:
  • キーボードウィルショー: キーボードフレーム = {0, 306, 320, 262}

iPhone 5 の iOS7 キーボードのライフサイクル

  • ビューが表示されます:
  • [YourTextField becomeFirstResponder]
  • キーボードウィルショー: キーボードフレーム = {0, 308, 320, 260}

  • [戻るボタンがタップされました]

  • キーボードウィルハイド: キーボードフレーム = {0, 568, 320, 260}
  • キーボードの非表示:
  • キーボードウィルショー: キーボードフレーム = {0, 308, 320, 260}
  • キーボードウィルハイド: キーボードフレーム = {0, 320, 320, 260}
  • viewDidDisappear:

  • [既存のView Controllerをプッシュ]

  • ビューが表示されます:
  • キーボードウィルショー: キーボードフレーム = {0, 308, 320, 260}

違いは、iOS7 は正式にキーボード ポップを非表示にしようとしますが、キーボードが再び表示されることです。

したがって、両方のケースでキーボードを非表示にする場合は、 textField をviewWillDisappearで明示的に再署名する必要があります。viewWillDisappearではtextField.isFirstResponderNOに等しいことに注意してください。

[textField resignFirstResponder]; 

問題を解決します。

于 2013-12-18T13:37:27.813 に答える