UITextView:我必须总是resignFirstResponder吗?

时间:2011-06-18 23:02:16

标签: objective-c ios uitextfield uitextview resignfirstresponder

我必须始终为UITextView resignFirstResponder吗?或者,这会在视图控制器消失时自动发生吗?

我问的是因为我遇到类似于iPhone Objective-C: Keyboard won't hide with resignFirstResponder, sometimes的问题,即使导航控制器推动并弹出其他视图控制器,键盘也会保持不变。键盘工作,当我点击完成后,它会取消UITextView(即光标消失),但键盘保持不动。

我从来没有发现为什么会发生这种情况,但也许这是因为在推送另一个视图控制器之前没有做resignFirstResponder,但我认为它是可选的?

4 个答案:

答案 0 :(得分:2)

总的猜测,UITextView引用了视图控制器(作为其委托),但没有保留它。当你进入下一个屏幕时,控制器被释放,然后UITextView(可能已被其他东西保留)尝试回叫解除分配的控制器并崩溃。当你拨打resignFirstResponder时,你会反转这种情况,因此不会崩溃。

通过这种方式在视图控制器的textView.delegate = nil方法中添加dealloc调用 - 显然是在发布文本视图之前将其放入。

答案 1 :(得分:1)

UITextView与其委托之间的合同表示文本视图完成编辑后的委托will send -resignFirstResponder。这通知框架视图已完成编辑,触发与其相关的事件(willEndEditing和didEndEditing),并允许响应者层次结构的其他部分作出相应的反应。如果不这样做可能会奏效,但它不遵守它同意的合同(这是所有协议)。

答案 2 :(得分:1)

我认为您不必这样做,因为Xcode Sample UICatalog UITextField在弹出resignFirstResponder之前未调用TextViewController

键盘卡住我的原因是我有相同的视图控制器同时以模态方式呈现两个视图控制器,一个接一个。 UIKit不喜欢这样。

答案 3 :(得分:0)

调用resignFirstResponder可确保text属性包含控件中显示的实际文本。

根据状态,这并不总是必要的,但如果你的控件已经让第一响应者辞职,你知道你正在处理有效数据。