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

我的第一个问题是为什么要推动透明视图控制器。通过在同一个控制器中分层透明视图是否可以更好地满足您的需求?

如果不查看您的要求,很难确定,但这很可能更符合通常的逻辑分离:您需要可以从一个视图接收输入并将其传递给其他逻辑的代码。它需要了解两者的内部结构,因此是具有完成任务所需知识的控制器对象的良好候选者。

在这种情况下,您根本不会遇到任何问题 - 只需展示您的透明视图,然后将触摸传递给您想要的任何操作。

但有充分的理由做一个透明的 VC。要访问您下方的 VC,您可以像另一个响应者所说的那样访问应用程序委托。我会将应用程序委托排除在外,只需访问 self.navController.viewControllers。该数组表示 VC 的堆栈。然后向下迭代 - 你“下方”的那个是你想要传递消息的那个。

最有可能的不是使用 isMemberOfClass,而是您想要定义一个协议并检查 VC 是否符合ToProtocol。

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,然后再往下看。这摆脱了循环。

顺便说一句,上一个答案中的伪代码混淆了 UIViews 和 UIViewControllers;也许这对你来说很清楚。无法通过访问视图来访问视图控制器。

于 2013-01-06T19:53:50.913 回答
1

我将首先获得对 rootViewController 的引用。我假设您的层次结构是 root -> 1st view controller --> 2nd view controller,然后通过初始化 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 回答