【问题标题】:motionBegan:withEvent: not called in AppDelegate in iOS 10motionBegan:withEvent: 在 iOS 10 的 AppDelegate 中未调用
【发布时间】:2016-09-15 19:01:56
【问题描述】:

我曾经通过简单地实现这个方法来检测来自 AppDelegate 的抖动运动:

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    NSLog(@"shake shake shake");
}

在 iOS 8 和 9 中运行良好。但在 iOS 10 中不再运行。 我也尝试添加

- (BOOL)canBecomeFirstResponder {
        return YES;
}

但这并没有帮助。不过,这在 UIViewControllers 中运行良好。 iOS 10 有什么变化,还是只是一个错误?

【问题讨论】:

    标签: ios uikit ios10 uiresponder


    【解决方案1】:

    我和你有同样的问题。我现在没有在 AppDelegate 上实现它,而是使用 UIWindow,它适用于 iOS 8-10。也许这对您也可行?

    extension UIWindow {
    
        override open var canBecomeFirstResponder: Bool {
            return true
        }
    
        override open func motionBegan(_ motion: UIEventSubtype, with event: UIEvent?) {
            if motion == .motionShake {
                //logic here
            }
        }
    }
    

    如果你想做得更干净,你可以在应用程序上设置一个专门的 UIWindow 版本。

    【讨论】:

    • 谢谢@jayjunck。我通过将此逻辑移动到根视图控制器中来在我的代码中修复它。我确信有很多解决方法,但他们仍然没有解释为什么它在 AppDelegate 中不起作用。 AppDelegate 是一个 UIResponder,所以它应该可以工作......
    【解决方案2】:

    我遇到了类似的问题,我尝试了@jayjunck 的答案,但 Xcode 抛出了Method does not override any method from its superclass。我通过用open 替换public 来修复它以访问和覆盖motionBegan 函数 在 Swift 3 中,

    • open 类可以在定义模块之外访问和子类化。一个开放类成员可以在定义模块之外访问和覆盖。

    • public 类可以访问,但不能在定义模块之外进行子类化。公共类成员在定义模块之外是可访问的,但不可覆盖。

    在此处输入代码

    extension UIWindow {
    override open func motionBegan(_ motion: UIEventSubtype, with event: UIEvent?) {
            super.motionBegan(motion, with: event)
    
            guard motion == UIEventSubtype.motionShake else { 
                return 
            }
    
            // Shake is detected 
        }
    }
    

    斯威夫特 5

    extension UIWindow {
            open override func motionBegan(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
                super.motionBegan(motion, with: event)
    
                guard motion == UIEvent.EventSubtype.motionShake else {
                    return
                }
    
                // Shake is detected
            }
    }
    

    【讨论】:

      【解决方案3】:

      您应该在(所有)视图控制器中覆盖 motionBegan 方法。

      【讨论】:

      • 它在视图控制器中工作正常,这不是问题。我需要它在 AppDelegate 中工作。
      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 2020-10-16
      相关资源
      最近更新 更多