我正在编写一个加载选项屏幕(场景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文本字段成为第一个响应者。对于我的生活,我无法发现应用程序崩溃的原因。
答案 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(),则会导致崩溃。所以最好遵循总是在主线程中执行的上述方法。