【问题标题】:send touch event to UIviewController stacked in the back将触摸事件发送到堆叠在后面的 UIviewController
【发布时间】:2013-01-06 10:21:53
【问题描述】:

在我的应用程序中,我有 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 我认为它会成功

【问题讨论】:

    标签: iphone ios uiview hittest


    【解决方案1】:

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

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

    在这种情况下,您完全没有问题 - 只需展示您的透明视图,然后将触摸传递给您想要的任何操作。

    但有充分的理由做一个透明的 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;也许这对你来说很清楚。无法通过访问视图来访问视图控制器。

    【讨论】:

      【解决方案2】:

      我将首先获取对 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];
               }
      }
      

      【讨论】:

      • 理想情况下,您可以点击“接受”任何您认为有效的答案。这就是 Stack Overflow 的工作方式——我们必须互相提供反馈。
      猜你喜欢
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多