我已经基于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(在这种情况下,因为我们谈论的是非触摸事件,所以从“第一响应者”开始)。

我的问题是:
  • “单一视图”中的初始第一响应者是什么
    应用程序启动后的“应用程序”?(是UIViewControllerview中最后添加的子视图吗?)
  • 设置初始响应者的对象是什么?
  • 最佳答案

    设置初始响应者的对象是什么?

    设置为初始第一响应者的对象是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是否由视图控制器处理了动作事件。

    10-04 23:04