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

时间:2010-06-14 16:36:43

标签: iphone iphone-sdk-3.0 uinavigationcontroller uitouch

简而言之,我想检测导航控制器标题栏上的触摸,但实际上却无法触及任何触摸!

如果这有所不同,一切都在没有IB的情况下完成。

我的app委托的.m文件包含:

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 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

视图控制器被插入到其管理视图和超级视图之间的响应链中:

  

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

UIViewController documentation

控制器的托管视图是否可能正在吃掉所有事件?它是什么样的观点?

答案 2 :(得分:4)

这有问题,因为我的自定义视图在视图层次结构中更深。相反,我爬上了响应链,直到找到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];
}

答案 3 :(得分:2)

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

答案 4 :(得分:0)

这些方法应放入UIView子类而不是UIViewControllers ... UIView将接收触摸回调,然后你可以在UIView上制作协议并在UIViewController上实现它,这样UIViewController就会收到一些回调当触摸事件发生时...这是一个链接,讨论协议以及如何定义它们并实现它们Protocols Ref