1

私はいつもresignFirstResponderをUITextViewにする必要がありますか?または、View Controllerが表示されなくなったときに自動的にこれが行われますか?UITextView:私はいつもresignFirstResponderを終了しなければなりませんか?

iPhone Objective-C: Keyboard won't hide with resignFirstResponder, sometimesのような問題が発生しているため、Navコントローラが他のView Controllerをプッシュしてポップしても、キーボードがそのままになっているため、質問しています。キーボードが機能し、完了したら、UITextViewのフォーカスが外れます(カーソルが消えます)が、キーボードはそのままです。

なぜこれが起こっているのか分かりませんでしたが、別のビューコントローラをプッシュする前にresignFirstResponderを実行していないことが原因である可能性があります。

答えて

1

Xcode Sample UICatalog UITextFieldは、TextViewControllerがポップされる前にresignFirstResponderを呼び出していないため、私はあなたが持っているとは思わないです。

キーボードが私のために立ち往生したのは、同時に2つのView Controllerを同時にモーダルにしていたことです。 UIKitはそれを好まなかった。

2

全体の推測では、UITextViewは(そのデリゲートとして)ビューコントローラへの参照を持ちますが、保持しません。次の画面に行くと、コントローラが解放され、UITextView(おそらく何か他のものによって保持されている)が、解放されたコントローラをコールバックしてクラッシュしようとします。 resignFirstResponderに電話すると、これが起こる順序が逆になり、クラッシュすることはありません。

textView.delegate = nilコールをビューコントローラのdeallocメソッドに追加する方法は、テキストビューを解放する前に明示的に入力してください。

+0

'textView.delegate = nil'は良い提案です。 ncがそのスタック( 'nc.viewControllers')からvcをポップするまで、vcはナビゲーションコントローラ(nc)によって保持されるので、ビューコントローラ(vc)は別のvcを押すことによって解放されません。だから、私はこのvcをポップしますが、テキストフィールドはvcのivarです。したがって、vcをポップすると、割り当てが解除されていれば、テキストフィールドもdeallocされます。なぜなら、vcのdealloc&viewDidUnload 。これが問題を引き起こしているのかどうかもわかりません。それは別のものかもしれない。 – ma11hew28

0

resignFirstResponderを呼び出すと、textプロパティにコントロールに表示される実際のテキストが含まれていることが確認されます。

状態によっては、これは必ずしも必要ではありませんが、コントロールが最初の応答者を辞任した場合は、有効なデータを扱っていることがわかります。

+0

本当ですか? Xcodeドキュメンテーションのどこにそれが書かれていますか? – ma11hew28

+0

ドキュメントを確認したところ、iOSでは必要ないという点があるかもしれません。 OS XのNSControlやサブクラス(NSTextFieldなど)では、保留中の編集がコミットされた(または同じことを引き起こした 'resignFirstResponder')があることを確認するために' commitEditing'を呼び出す必要がありますが、iOSでは必須ではないかもしれません。しかし、それをすることを傷つけることはありません。 –

1

UITextViewとその代理人の間の契約では、テキストビューが編集を完了したときに代理人will send -resignFirstResponderが表示されます。これは、ビューが編集されたことをフレームワークに通知し、それに関連するイベント(willEndEditingおよびdidEndEditing)を発生させ、レスポンダ階層の他の部分がそれに応じて反応することを可能にする。そうしないとうまくいくかもしれませんが、それは合意した契約(それはすべてプロトコルです)に従っていません。

関連する問題