2016-09-15 40 views
7

我用通过简单地实现该方法,检测从AppDelegate中抖动运动:motionBegan:withEvent:方法中的AppDelegate在IOS不叫10

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

其中在IOS 8工作正常和9。然而它不”不再适用于iOS 10。 我也试过添加

- (BOOL)canBecomeFirstResponder { 
     return YES; 
} 

但这并没有帮助。这在UIViewControllers中可以正常工作。 iOS 10中有什么改变,还是只是一个错误?

回答

-2

您应该覆盖(全部)视图控制器中的motionBegan方法。

+0

它在视图控制器中工作正常,这不是问题。我需要它在AppDelegate中工作。 – almas

7

我和你有同样的问题。而不是在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的专用版本。

+0

谢谢@jayjunck。我通过将这个逻辑移动到根视图控制器中将其固定在我的代码中。我确定有很多解决方法,但他们仍然没有解释为什么它不能在AppDelegate中工作。 AppDelegate是一个UIResponder,所以它应该工作... – almas

1

我有一个类似的问题,我试着@jayjunck的答案,但Xcode抛出Method does not override any method from its superclass。我固定它通过用open替换public访问和重写motionBegan功能

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 
    } 
} 

在夫特3,

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

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