用swift编写的iOS应用程序在返回视图时崩溃

时间:2016-01-16 18:02:44

标签: ios swift

我正在编写一个加载选项屏幕(场景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(代码= 2,地址= hexHere)

class AppDelegate: UIResponder, UIApplicationDelegate {

这个想法是每次加载视图时让numeratorBegin文本字段成为第一个响应者。对于我的生活,我无法发现应用程序崩溃的原因。

2 个答案:

答案 0 :(得分:0)

我怀疑becomeFirstResponder设置了一些依赖于视图层次结构的内部状态/变量。调用viewDidLoad()时,视图层次结构尚未设置,因此这些状态可能会以某种方式偏斜并影响某些UI组件的发布周期。

您应该在viewWillAppear中调用becomeFirstResponder。视图层次结构已准备就绪。

答案 1 :(得分:0)

为Alain T.的答案增加一些要点。

而不是

self.numeratorBegin.becomeFirstResponder()

内的

override func viewDidLoad()

将其添加到override func viewWillAppear()

self.numeratorBegin.resignFirstResponder()内的override func viewWillDisappear()

如果您尝试在其他线程中使用becomeFirstResponder()/ resignFirstResponder(),则会导致崩溃。所以最好遵循总是在主线程中执行的上述方法。