2

Appleのコード例と同じように実装されたViewControllerコンテインメントを使用して、2つのViewControllerが同時に画面に表示されます。それらをビューコントローラーA(vcA)とビューコントローラーB(vcB)、およびコンテナービューコントローラー(containerVC)と呼びます。

各vcAとvcBには両方ともオブジェクトのグリッドがあり、オブジェクトをvcAからvcBにドラッグできるようにしたいと思います。具体的には、vcAで発生したタッチが、境界vcB内に入ると、vcBのtouchesMoved:withEventメソッドにヒットするようにします。

containerVCのtouchesMoved:withEventメソッドをオーバーライドし、ヒットテストを介してタッチを追跡し、次のようにUIView階層にタッチを転送してみました。

// in the containerVC
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    CGPoint locationPoint = [[touches anyObject] locationInView:self.view];
    UIView* touchIsInViewControllerA = [vcA hitTest:locationPoint withEvent:event];
    if (touchIsInViewControllerA) {
        NSLog(@"Touch is in vcA");
        return;
    }
    UIView* touchIsInViewControllerB = [vcB hitTest:locationPoint withEvent:event];
    if (touchIsInViewControllerB) {
        NSLog(@"Touch is in vcB");
        [vcB touchesMoved:touches withEvent:event]; // this causes a crash
    }
}

これは再帰的であるように見えます。containerVCがタッチイベントを階層の下にプッシュし、次にvcBがタッチイベントを階層に戻します。

私の質問:vcBがtouchイベントをレスポンダーチェーンのcontainerVCに戻さないようにする方法はありますか?または、これを別の方法でアプローチする必要があります-vcBをvcAのデリゲートにし、containerVCを方程式から除外しますか?

注:一般的な対応は、VC包含パターンを放棄し、すべてを1つのビューコントローラーに保持することだと思いますが、この例に示されていない理由により、完全に狂気でない限り、それらを分離しておく方がうまくいくと思いますそしてそうするための超ハッキー...

4

1 に答える 1

0

この問題は、View Controller ごとに個別のジェスチャ オブジェクトを設定することで簡単に解決できます。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

 if (touchIsInViewControllerA) {

// calls a delegate of view controller A

  }
else
 {

// calls a delegate of view controller B
 }
}
于 2013-10-15T09:46:56.257 に答える