3

私のアプリには、2 つの透明なUIViewControllerレイヤーがあります。最初のレイヤーにはUIView、タッチで認識しようとしているオブジェクトが含まれています:

 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;

方法。

問題は、そのUIViewController上に透明なものがあることです。

にタッチイベントを実装しSeconedStackedViewController、インスタンスを作成してFirstStackedViewControllerそこから同じメソッドを呼び出そうとしました。メソッドは呼び出されますが、ヒット テストは呼び出されません。

コード:

FirstStackedViewController *fsvc = [[FirstStackedViewController alloc]init];


- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
      [fsvc hitTest:point withEvent:event];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
      fsvc = [[FirstStackedViewController alloc]init];
      [fsvc touchesEnded:touches withEvent:event];
}

で呼び出されるようにこのメソッドをオーバーライドするにはどうすればよいFirstStackedViewControllerですか? タッチをシミュレートできればFirstStackedViewController、うまくいくと思います

4

2 に答える 2

2

私の最初の質問は、透過的なビュー コントローラーをプッシュしている理由です。同じコントローラー内に透明なビューをレイヤー化することで、ニーズがよりよく満たされるでしょうか?

要件を見ずに、確実に言うのは難しいですが、これは通常のロジックの分離と一致している可能性が高く、1 つのビューから入力を受け取り、それを他のロジックに渡すことができるコードが必要です。両方の内部構造について知る必要があるため、タスクを達成するために必要な知識を持つコントローラー オブジェクトとして適しています。

この場合、まったく問題はありません。透明なビューを表示し、希望するアクションにタッチを渡すだけです。

しかし、透過的なビューで VC を実行するのには十分な理由があります。あなたの下の VC にアクセスするには、別のレスポンダーが言ったように、アプリ デリゲートにアクセスできます。アプリのデリゲートを除外し、self.navController.viewControllers にアクセスするだけです。この配列は、VC のスタックを表します。次に、下方向に反復します。「下」のものは、メッセージを中継したいものです。

ほとんどの場合、isMemberOfClass を使用するのではなく、プロトコルを定義して、VC がプロトコルに準拠しているかどうかを確認します。

for (int i=0; i < navBar.viewControllers.count ; i++) {
   UIViewController *current = navBar.viewControllers[i];
   if (current == self) {
      UIViewController *targetVC = navBar.viewControllers[i+1]; // make sure you're not over bounds - you could do this in the loop def'n.
      if ([targetVC class] conformsToProtocol("TransparentPassingActions")]) {
         // pass message
      }
   }
}

indexOfObject を使用して現在の VC を取得し、1 つ下を調べることもできます。それはループを取り除きます。

ちなみに、前の回答の疑似コードは、UIViews と UIViewControllers を混同しています。おそらくこれはあなたには明らかでした。ビューにアクセスしてView Controllerにアクセスすることはできません。

于 2013-01-06T19:53:50.913 に答える
1

rootViewControllerへの参照を取得することから始めます。階層がルート->1番目のビューコントローラー->2番目のビューコントローラーであると想定し、fsvcを初期化することにより、新しいインスタンスを作成し、実際にはビュー階層から参照を取得していません。

rootviewcontrollerサブビューを繰り返し処理し、最初のviewcontrollerのインスタンスを見つけてから、そのインスタンスのメソッドを呼び出すことをお勧めします。

//PSEUDO-Code for class names, but iteration should solve the problem.
if(UIView *view in RootViewController.subviews){
     if(view isMemberOfClass: [FirstStackedViewController class]]){
          [(FirstStackedViewController *)view touchesEnded:touches withEvent:event];
     }
}

//ToolUser was right about mixing up VCs and regular Views, you'd want to do this:
for(UIViewController *vc in self.navigationController.viewControllers){
        if(view isMemberOfClass: [FirstStackedViewController class]]){
              [(FirstStackedViewController *)vc touchesEnded:touches withEvent:event];
         }
}
于 2013-01-06T16:27:37.333 に答える