如何跟踪两个UIView控制器之间的UITouches? (使用收容)

时间:2012-08-15 13:56:32

标签: cocoa-touch ios5 uiviewcontroller uitouch

我有两个视图控制器同时使用视图控制器包含出现在屏幕上,实现与Apple的代码示例相同。称它们为视图控制器A(vcA)和视图控制器B(vcB),以及容器视图控制器(containerVC)。

每个vcA和vcB都有一个对象网格,我希望能够将对象从vcA拖到vcB。更具体地说,我希望源自vcA的触摸在vcB中触及touchesMoved:withEvent方法,一旦它在界限vcB内。

我已经覆盖了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将响应事件传递给容器VC?或者我应该以不同的方式处理这个问题 - 让vcB成为vcA的代表并将containerVC排除在等式之外?

注意:我猜测一个常见的响应是放弃VC包含模式并将其全部保存在一个视图控制器中,但由于此示例中未显示的原因,我认为将它们分开对我来说会更好 - 除非这样做完全疯狂和超级黑客......

1 个答案:

答案 0 :(得分:0)

通过为每个视图控制器设置单独的手势对象,可以轻松解决此问题。

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

 if (touchIsInViewControllerA) {

// calls a delegate of view controller A

  }
else
 {

// calls a delegate of view controller B
 }
}