代码之家  ›  专栏  ›  技术社区  ›  SaltyNuts

在UINavigationController中未检测到触摸开始和其他触摸事件

  •  1
  • SaltyNuts  · 技术社区  · 15 年前

    简而言之,我想在导航控制器标题栏上检测到触摸,但在实际捕捉任何触摸时都有困难!

    一切都是在没有IB的情况下完成的,如果这有区别的话。

    MyViewController *viewController = [[MyViewController alloc] init];
    navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
    [window addSubview:navigationController.view];
    

    有一些其他子视图以覆盖navigationController的方式添加到此窗口,只留下可见的导航栏。

    MyViewController是UIViewController的子类,其.m文件包含:

    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
     for (UITouch *touch in touches) {
      NSLog(@"ended\n");
     } 
    
    }
    
    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
     for (UITouch *touch in touches) {
      NSLog(@"began\n");
     } 
    }
    

    我还尝试将这些函数直接放入app delegate的.m文件中,但控制台仍然为空。

    5 回复  |  直到 15 年前
        1
  •  7
  •   SaltyNuts    15 年前

    好吧,由于缺乏更好的想法,我在我的应用程序中添加了另一个子视图,颜色清晰,以编程方式放置在导航栏标题上,并为该视图使用了一个自定义类,覆盖了相关的touch方法。工作正常,但我还是希望有一个更优雅的解决方案。

        2
  •  5
  •   Dirk    15 年前

    视图控制器插入到其托管视图和superview之间的响应程序链中:

    因为视图控制器与它们管理的视图紧密绑定,所以它们也是用于处理事件的响应程序链的一部分。视图控制器本身是UIResponder类的后代,并插入到托管视图及其superview之间的响应器链中。因此,如果视图控制器管理的视图不处理事件,它会将事件传递给其视图控制器,然后视图控制器可以选择处理事件或将其转发给views superview。

    UIViewController documentation )

    控制器的托管视图是否可能正在吞噬所有事件?这是什么样的景色?

        3
  •  4
  •   Autonomy    13 年前

    UIViewController

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        // Pass to top of chain
        UIResponder *responder = self;
        while (responder.nextResponder != nil){
            responder = responder.nextResponder;
            if ([responder isKindOfClass:[UIViewController class]]) {
                // Got ViewController
                break;
            }
        }
        [responder touchesBegan:touches withEvent:event];
    }
    
        4
  •  2
  •   j2emanue    14 年前

    尝试将userInteractionEnabled=YES方法添加到UIImageView

        5
  •  0
  •   Daniel    15 年前