2016-09-15 76 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類在定義模塊之外是可訪問但不可子類化的。公共類成員是可訪問的,但不能在定義模塊之外進行覆蓋。