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 中未调用的主要内容,如果未能解决你的问题,请参考以下文章
NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记