2016-09-15 9 views
7

にAppDelegateに呼び出されていない:motionBegan:withEvent:私は単にこのメソッドを実装することで、AppDelegateから手ブレの動きを検出するために使用されるiOSの10

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event { 
    NSLog(@"shake shake shake"); 
} 
のiOS 8で正常に動作

と9しかしそれはdoesnのもうiOS 10ではうまく動作しません。 また、私は追加しようとしました

- (BOOL)canBecomeFirstResponder { 
     return YES; 
} 

しかし、それは助けになりませんでした。しかし、これはうまくUIViewControllerで動作します。 iOS 10で何か変わったのですか、まさにバグですか?

答えて

-2

(すべての)View ControllerでmotionBeganメソッドをオーバーライドする必要があります。

+0

ビューコントローラーで問題なく動作しますが、問題はありません。 AppDelegateで動作する必要があります。 – almas

7

私はあなたと同じ問題がありました。 AppDelegateに実装するのではなく、iOS 8-10で動作するUIWindowを使用します。おそらく、これはあなたにとっても可能ですか?

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クラスを定義するモジュールのアクセスとサブクラス化の外側であり、アクセスしスウィフト3で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 
        } 
    } 
    

    を上書きするopenpublicを置き換えることによってそれを修正しました。オープンクラスのメンバは、定義可能なモジュールの外部でアクセス可能でオーバーライド可能です。

  • publicクラスはアクセス可能ですが、定義モジュール外ではサブクラス化できません。パブリッククラスメンバはアクセス可能ですが、定義モジュール外ではオーバーライドできません。

関連する問題