2012-05-13 9 views
0

私は、動作するかどうかを見るためにmotionBegan:withEvent:メソッドをビューコントローラに配置しましたが、呼び出されていません。 viewWillAppearでは、私はビューコントローラを最初のレスポンダとし、canBecomeFirstResponderからYESを返します。アプリケーションデリゲートに振りジェスチャーイベントを渡す

このビューコントローラはスプリットビューのマスターペインにあるため、デバイスを揺する前に最初のレスポンダが変更されている可能性があります。

しかし私の本当の疑問は、どのように私のアプリケーションの代理人のハンドラにすべてのモーションイベントを渡すことができますか?私は本当にmotionBegan:withEvent:すべてのView Controllerのメソッドまたはすべての最初のレスポンダーの代理人を持つ必要がありますか?このようなイベントをUIResponderにコードを挿入することなくレスポンダーチェーンを流れさせる方法はありませんか?それはあると思われますが、私はこれを行う方法について私の指を置いていません。

答えて

1

最も簡単な方法は、あなたが別のソリューションは、カテゴリを作成したり-viewWillAppear:more info

+0

UIApplicationクラスとUIApplicationMain関数がこれにどのように結びついているのかお礼してくれてありがとう。これは私が慣れていない領域であり、それについて知ることは非常に便利です。私がこの権利を理解すれば(そして今夜試してみましょう)、サブクラス化されたUIApplicationでは、 'sendEvent : '、直ちに(振る舞いのように)扱いたい人に作用させてから、通常の処理が必要な人には[super sendEvent:event]を呼び出します。 – Jim

+0

UIApplicationのサブクラス化は完全に機能しました。関心のある他の人にとっては、デバイスがユーザーのポケットに入っていても揺れイベントが発生する可能性があります。追加のフィルタリングが必要になります。 – Jim

0

を拡張であるあなたは、このクラスを使用する可能性のあるすべてのイベント

int retVal = UIApplicationMain(argc, argv, @"myApplication", @"myAppDelegate"); 

オーバーcontrollを持つことになりますUIApplication-sendEvent:をオーバーライドしています私が渡したことは、motionBeganメソッドを実装するUIWindowのカテゴリを作成することでした。そのmotionBeganメソッドでは、カスタムNSNotificationをブロードキャストします。次に、モーションイベントを必要とするアプリケーションのどこにでも、モーション通知のオブザーバを追加するだけです。

カテゴリはオブジェクトのすべてのインスタンスにメソッドを追加するので、システム作成ウィンドウでもmotionBeganメソッドが得られ、適切な処理を行います。それは美しく動作します。

+0

UIWindowがfirstResponderへの代理人でない場合、これがどのように動作するのか分かりません。 motionBegan:firstResponderであるUIRespopnder(またはサブクラス化されたUIResponder)オブジェクトのデリゲートのメソッドです。それは必ずしもそうではないかもしれません(通常、私は賭けていません。)間違っていますか? – Jim