1

我必须经常为UITextView resignFirstResponder吗?或者,当视图控制器消失时会自动发生吗?UITextView:我必须总是resignFirstResponder吗?

我在问,因为我遇到类似于iPhone Objective-C: Keyboard won't hide with resignFirstResponder, sometimes的问题,即使导航控制器压入并弹出其他视图控制器时,键盘仍然保持不变。键盘工作正常,当我完成时,它不重点关注UITextView(即光标消失),但键盘保持不变。

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

回答

1

我不认为你必须这样做,因为Xcode Sample UICatalog UITextField在弹出TextViewController之前不会呼叫resignFirstResponder

原因键盘卡住了,我是,我是有模态在同一时间,一前一后的相同视图控制器目前的两个视图控制器。 UIKit不喜欢那样。

2

在一个总的猜测,该UITextView的具有视图控制器的引用(作为它的代表),但不保留。当你进入下一个屏幕时,控制器被处理掉,然后UITextView(它可能被别的东西保留下来)试图回叫处理器并崩溃。当您致电resignFirstResponder时,您会反转发生这种情况的顺序,因此不会崩溃。

在你的视图控制器的dealloc方法中 - 在您释放文本视图之前明显地将它添加到textView.delegate = nil调用中。

+0

'textView.delegate = nil'是一个很好的建议。视图控制器(vc)不会通过推送另一个vc来处理,因为vc由其导航控制器(nc)保留,直到nc从其堆栈('nc.viewControllers')弹出vc。所以,我弹出这个vc,但文本字段是vc的ivar,所以当我弹出vc时,如果它被处理,那么它的文本字段也应该处理,因为我在vc的dealloc&viewDidUnload中这样做。我也不确定这是否甚至造成问题。这可能是别的。 – ma11hew28

0

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

根据不同的状态,这并不总是必要的,但如果你的控制已经辞职第一响应者,你知道,你用有效的数据工作。

+0

真的吗?它在Xcode文档中说什么? – ma11hew28

+0

现在我检查了文档,您可能会注意到这不是iOS所必需的。对于OS X上的NSControl和子类(例如NSTextField),您应该调用'commitEditing'来确保任何挂起的编辑已经提交(或导致同一事件发生的'resignFirstResponder'),但在iOS上可能不需要。尽管如此,它并没有伤害。 –

1

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