16 iphone
Apple很有趣.我的意思是,他们说这有效:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch* touch = [touches anyObject];
NSUInteger numTaps = [touch tapCount];
if (numTaps < 2) {
[self.nextResponder touchesBegan:touches withEvent:event];
} else {
[self handleDoubleTap:touch];
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个View Controller.如您所知,View Controllers继承自UIResponder.View Controller创建一个继承自UIView的MyView对象,并将其作为子视图添加到它自己的视图中.
所以我们有:
View Controller>有一个View(自动)>有一个MyView(这是一个UIView).
现在在MyView中,我把上面的代码放在一个打印"触摸MyView"的NSLog上.但我将事件转发给下一个响应者,就像上面一样.在ViewController中我有另一个touchesBegan方法,只打印一个NSLog和一个"触摸视图控制器".
现在猜猜:当我触摸MyView时,它会打印出"触摸的MyView".当我触摸MyView的外部,这是VC的视图时,我得到一个"触摸的视图控制器".所以两者都有效!但是什么不起作用是转发事件.因为现在,实际上下一个响应者应该是视图控制器,因为中间没有别的东西.但是当我转发它时,VC的事件处理方法永远不会被调用.
%$&!§!!
想法?
想出奇怪的东西 MyView的下一个响应者是视图控制器的视图.这是有道理的,因为MyView是一个子视图.但是我没有从视图控制器修改这个UIView.这没什么习惯的.它没有实现任何触摸事件处理.消息是否应该传递给视图控制器?我怎么能让它通过?如果我在MyView中删除事件处理代码,那么事件很好地到达视图控制器.
根据类似的问题,你的方法应该工作.
这使我认为你的观点的nextResponder是不实际的ViewController,因为你怀疑.
我会NSLog在您的转发代码中添加一个快速检查,以确定您的nextResponder真正意义:
if (numTaps < 2) {
NSLog(@"nextResponder = %@", self.nextResponder);
[self.nextResponder touchesBegan:touches withEvent:event];
}
Run Code Online (Sandbox Code Playgroud)
您还可以更改其他NSLog消息,以便它们输出类型和地址信息:
NSLog(@"touched %@", self);
Run Code Online (Sandbox Code Playgroud)
touched <UIView 0x12345678>
这应该可以帮助您开始诊断问题.
| 归档时间: |
|
| 查看次数: |
25115 次 |
| 最近记录: |