我已经基于XCode的“单视图应用程序”模板创建了一个新的iOS应用程序,并且只修改了UIViewController
:
class ViewController: UIViewController {
override func canBecomeFirstResponder() -> Bool {
return false
}
override func motionBegan(motion: UIEventSubtype, withEvent event: UIEvent?) {
print("motionBegan")
}
}
问题是,当我摇晃设备时,尽管
motionBegan
返回canBecomeFirstResponder
,但函数false
被调用。AFAIK应该在响应者链中的
motionBegan
上调用UIResponder
(在这种情况下,因为我们谈论的是非触摸事件,所以从“第一响应者”开始)。我的问题是:
应用程序启动后的“应用程序”?(是
UIViewController
的view
中最后添加的子视图吗?)最佳答案
设置初始响应者的对象是什么?
设置为初始第一响应者的对象是UIWindow。
From the Event Handling Guide for iOS:
运动和远程控制事件。有了这些事件,窗口对象
将震动运动或远程控制事件发送到第一个
响应者进行处理。第一响应者在
响应者链由响应者对象组成。
应用程序启动后,“单视图应用程序”中的初始“第一响应者”是什么? (这是UIViewController视图中最后添加的子视图吗?)
必须设置一个事件来设置初始的第一响应者,在这种情况下是视图控制器,因为它会覆盖“运动开始”方法。
该事件由响应者链机制处理,并一直传递到找到可以处理该事件的对象为止。触摸事件和运动事件的路径略有不同,请参见事件传递:有关详细信息,请参见Event Handling Guide for iOS中的响应者链。
看来您正在关注Detecting Shake-Motion Events with UIEvent中的信息。哪个状态覆盖这两种方法。
override func canBecomeFirstResponder() -> Bool {
return false
}
override func motionBegan(motion: UIEventSubtype, withEvent event: UIEvent?) {
print("motionBegan")
}
我做了一个与您相同的快速测试应用程序,并注意到设置'canBecomeFirstResponder()'的不影响viewt是否由视图控制器处理了动作事件。