所以,在我的应用程序中,然后按下地图注释,它会显示一个模态视图控制器。然后当按下模态控制器的元素时,我打开另一个较小的控制器。在两个控制器中,我已经实现了方法
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint touchPoint = [touch locationInView:self.view];
if (!CGRectContainsPoint([self.view viewWithTag:21].frame, touchPoint)) {
[self dismissViewControllerAnimated:YES completion:nil];
}
}
我的问题是当我触摸黄色圆圈时,第二个模态解散,然后,第一个模态解散。那么,我该如何防止第一个模态接收到触摸。
PS:两个模态都是透明的UIViews,内部有较小的视图来显示内容。
答案 0 :(得分:1)
显然,事件通过视图控制器传递给下一个响应者。
在UIResponder的课堂参考中。
此方法的默认实现不执行任何操作。然而 UIR应答器的UIKit子类,特别是UIView, 将消息转发到响应者链。要将邮件转发到 下一个响应者,将消息发送到super(超类 实现);不要将消息直接发送到下一个 响应者。例如,
[super touchesMoved:touches withEvent:event];
如果在不调用super的情况下覆盖此方法(常用) pattern),你还必须覆盖其他处理触摸的方法 事件,如果仅作为存根(空)实现。
因此,如果您不希望事件转发给下一个响应者,则应覆盖其他方法。
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
}
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
}
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint touchPoint = [touch locationInView:self.view];
if (!CGRectContainsPoint([self.view viewWithTag:21].frame, touchPoint)) {
[self dismissViewControllerAnimated:YES completion:nil];
}
}
- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
}