1

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

一切都在没有 IB 的情况下完成,如果这有所作为的话。

我的应用委托的 .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");
 } 
}

我还尝试将这些函数直接放入应用程序委托的 .m 文件中,但控制台仍然是空白的。

我究竟做错了什么?

4

5 回答 5

7

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

于 2010-06-14T17:38:21.163 回答
5

视图控制器被插入到其托管视图和父视图之间的响应者链中:

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

UIViewController 文档

您的控制器的托管视图是否有可能正在吞噬所有事件?这是一种什么样的看法?

于 2010-06-14T16:58:14.683 回答
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];
}
于 2012-06-22T12:29:51.933 回答
2

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

于 2012-04-25T17:04:34.143 回答
0

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

于 2010-06-14T17:39:42.743 回答