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

Sal*_*uts 1 iphone uinavigationcontroller uitouch iphone-sdk-3.0

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

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

我的app delegate的.m文件包含:

MyViewController *viewController = [[MyViewController alloc] init];
navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
[window addSubview:navigationController.view];
Run Code Online (Sandbox Code Playgroud)

此窗口中添加了一些其他子视图,其方式是覆盖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");
 } 
}
Run Code Online (Sandbox Code Playgroud)

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

我究竟做错了什么?

Sal*_*uts 7

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

  • @Daniel不,这是完美的.如果我们遇到同样的问题,通过编辑将答案嵌入到问题中将使我们更难找到解决方案. (12认同)

Dir*_*irk 5

视图控制器将在其托管视图和超级视图之间插入响应程序链:

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

(UIViewController文档)

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