我正在编写一个应用程序,它加载一个选项屏幕(场景1),用户将在其中填写一些文本字段,然后切换到一个新的场景(场景2)。在用户完成场景2之后,用户可以单击一个按钮,将他们重新划分回场景1,再次填写选项。在场景1中,我将第一个文本字段设置为第一个响应器,这样在视图加载时键盘就会自动显示。
override func viewDidLoad() {
super.viewDidLoad()
self.numeratorBegin.becomeFirstResponder()
// Do any additional setup after loading the view.
}当应用程序加载时,这个功能非常好。键盘出现,光标在numeratorBegin文本字段中。然而,当用户完成场景2并按下按钮回到场景1时,应用程序就会崩溃。在viewDidLoad中没有设置第一个响应程序时,不会发生崩溃。调试器显示以下导致消息线程1崩溃的行: EXC_BAD_ACCESS(Code=2,address=hexHere)
class AppDelegate: UIResponder, UIApplicationDelegate {这样做的目的是让numeratorBegin文本字段在每次加载视图时成为第一个响应者。对于我的生活,我不知道为什么这个应用会崩溃。
发布于 2016-01-17 05:35:25
在阿兰·T的回答中再加几个点。
而不是
self.numeratorBegin.becomeFirstResponder()内部override func viewDidLoad()
将其添加到override func viewWillAppear()
和self.numeratorBegin.resignFirstResponder()内部的override func viewWillDisappear()
如果尝试在其他线程中使用becomeFirstResponder()/resignFirstResponder(),则会导致崩溃。因此,最好遵循上述方法,这些方法总是在主线程中执行。
发布于 2016-01-17 04:16:24
我怀疑becomeFirstResponder设置了一些依赖于视图层次结构的内部状态/变量。当调用viewDidLoad()时,还没有设置视图层次结构,因此这些状态可能会以某种方式被扭曲,并影响某些UI组件的发布周期。
您应该在viewWillAppear中调用viewWillAppear。视图层次结构在这一点上已经就绪。
https://stackoverflow.com/questions/34830287
复制相似问题