1

ビューにカスタムサブビューがある UIViewController があります。

このカスタム サブビューは、タッチ イベントを追跡し、スワイプ ジェスチャを報告する必要があります。

現在、サブビュー クラスに touchesBegan、touchesMoved、touchesEnded、および touchesCancelled を配置しています。追加のロジックを使用して、スワイプ ジェスチャを取得し、handleRightSwipe メソッドと handleLeftSwipe メソッドを呼び出すことができます。したがって、サブビュー内でスワイプすると、ローカルのスワイプ処理メソッドが呼び出されます。これはすべてうまくいきます。

しかし、実際に必要なのは、handleRightSwipe および handleLeftSwipe メソッドがビュー コントローラーにあることです。それらをサブビュー クラスに残すこともできますが、すべてのロジックとデータも取り込む必要があり、MVC のアイデアが壊れてしまいます。

だから私の質問は、これを処理するクリーンな方法はありますか? 基本的に、タッチイベントメソッドをサブビューに保持して、その特定のビューでのみトリガーされるようにしたいと考えています。しかし、これらのタッチ イベント (この場合はスワイプ ジェスチャ) が発生したときにビュー コントローラーに通知することも必要です。

何か案は?

ありがとう。

アップデート:

Henrik の提案を使用して、私が行ったことの簡単なサンプルを次に示します (読み物を節約するため)。

View Controllerを通知のオブザーバーとして設定しました(早い段階で)。

// NOTIFICATION_LEFT_SWIPE is defined as some unique string elsewhere.
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];

// Note that imageView is the instance of my subview that is calling the notification.
// You can set this to nil if you don't want it to be specific.
[nc addObserver:self selector:@selector(handleLeftSwipe) name:@NOTIFICATION_LEFT_SWIPE object:imageView];

次に、handleLeftSwipe メソッドを実装します。これは、通知を受信したときに呼び出されます。

サブビューで、スワイプ ジェスチャを受信したときに通知を送信します。

// Note that NOTIFICATION_LEFT_SWIPE is the same one used in the view controller
// I put this in a global header I use.  This is how you keep track of notifications.
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc postNotificationName:@NOTIFICATION_LEFT_SWIPE object:self]; 

右スワイプも同様です。

4

2 に答える 2

1

OS3.2以降で利用可能なジェスチャ認識システムを使用することもできます。ジェスチャレコグナイザを使用すると、タッチ処理をビュークラスから切り離すことができ、ここで行っていることとほぼ同じように設計されています。この場合、のインスタンスを作成し、UIPanGestureRecognizerコントローラーをレコグナイザーのターゲットとして追加し(通常の-addTarget:action:構文を使用)、次にレコグナイザーをビューに追加します-addGestureRecognizer:。次に、ユーザーがビューをスワイプすると、コントローラーに一連のアクションメッセージが呼び出され、レコグナイザーの-translationInView:メソッドを呼び出して動きを確認できます。

于 2010-06-16T20:43:26.233 に答える
1

通知センターを使用して、さまざまな (監視している) オブジェクトに通知を送信できます。

于 2010-06-16T19:51:34.750 に答える