简而言之,我想检测导航控制器标题栏上的触摸,但实际上却无法触及任何触摸!
如果这有所不同,一切都在没有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文件中,但控制台仍为空白。
我做错了什么?
答案 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