开发者

UITextView: Must I always resignFirstResponder?

开发者 https://www.devze.com 2023-03-14 02:17 出处:网络
Must I always resignFirstResponder for a UITextView? Or, will this happen automatically when its vi开发者_StackOverflow中文版ew controller disappears?

Must I always resignFirstResponder for a UITextView? Or, will this happen automatically when its vi开发者_StackOverflow中文版ew controller disappears?

I'm asking because I'm having an issue similar to iPhone Objective-C: Keyboard won't hide with resignFirstResponder, sometimes, where the keyboard stays up even when the nav controller pushes and pops other view controllers. The keyboard works, and when I hit done, it unfocuses the UITextView (i.e., the cursor disappears), but the keyboard stays up.

I never found out why this is happening, but maybe it's due to not doing resignFirstResponder before pushing another view controller, but I thought it was optional?


At a total guess, the UITextView has a reference to the view controller (as its delegate) but does not retain it. When you go to the next screen, the controller is dealloced and then the UITextView (which has perhaps been retained by something else) tries to call back to the dealloced controller and crashes. When you call resignFirstResponder, you reverse the order this happens, and therefore no crash.

The way round this to add a textView.delegate = nil call in your view controller's dealloc method - obviously put it before you release the text view.


The contract between a UITextView and it's delegate says that the delegate will send -resignFirstResponder when the text view is done editing. This informs the framework that the view is done editing, fires the events relating to that (willEndEditing and didEndEditing), and allows other parts of the responder hierarchy to react accordingly. Failing to do so might work, but it's not following the contract (that's all a protocol is) it agreed to.


I don't think you have to because the Xcode Sample UICatalog UITextField doesn't call resignFirstResponder before the TextViewController is popped.

The reason the keyboard got stuck for me is that I was having the same view controller present two view controllers modally at the same time, one after the other. UIKit didn't like that.


Calling resignFirstResponder makes sure that the text property contains the actual text shown in the control.

Depending on the state this is not always necessary, but if your controls have resigned first responder, you know that you're working with valid data.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号