motionBegan:withEvent: 在 iOS 10 的 AppDelegate 中未调用

Posted

技术标签:

【中文标题】motionBegan:withEvent: 在 iOS 10 的 AppDelegate 中未调用【英文标题】:motionBegan:withEvent: not called in AppDelegate in iOS 10 【发布时间】: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 有什么变化,还是只是一个错误?

【问题讨论】:

【参考方案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 中工作。

以上是关于motionBegan:withEvent: 在 iOS 10 的 AppDelegate 中未调用的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 检测应用程序中任何地方的抖动

分配的变量引用在哪里,在堆栈中还是在堆中?

NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?