Swift:"奇怪"的事件响应链
初学iOS开发的童鞋可能会遇到各式奇怪的问题,这篇博文本猫就为大家介绍其中一个”怪异”问题. 该问题很好重现: 2.打开initVC类,只添加2个方法: override func touchesBegan(_ touches: Set<UITouch>,with event: UIEvent?) {
super.touchesBegan(touches,with: event)
NSLog("在destVC中触摸屏幕却会执行initVC中的这句代码")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
performSegue(withIdentifier: "ToDestVC",sender: nil)
}
3.好了,只需要修改这么多.现在编译运行app,由于上面代码的原因,首先initVC被显示,但很快切换到destVC中去.此时在destVC的视图中轻触屏幕,你会发现却是initVC中的touchesBegan方法被触发执行了,是否有些丈二和尚摸不着头脑呢?如果不信,请自行按照以上步骤操作查看结果. 究竟为何会这样呢?其实apple的开发文档中早就说明了原因: Understanding Event Handling,Responders,and the Responder Chain 如果不想看长篇大论,可以直接看最后这一段话: 说的很清楚吧,所以如果不用segue跳转,而是用present跳转到destVC,现象是一样的. 知道了原因如果避免这一”正常”的行为呢?很简单,一种办法是在initVC的prepare方法中关闭initVC.view的交互: override func prepare(for segue: UIStoryboardSegue,sender: Any?) {
if segue.identifier == "ToDestVC"{
view.isUserInteractionEnabled = false
}
}
另一种方法则是在destVC中重载next属性,将其置为nil,断开responder chain即可: override var next: UIResponder?{
return nil
} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |