iOS 应用程序在点击手势事件时崩溃

Posted

技术标签:

【中文标题】iOS 应用程序在点击手势事件时崩溃【英文标题】:iOS app crashes at tap gesture event 【发布时间】:2013-08-24 20:33:49 【问题描述】:

我有一个针对 iPad 的视图,我通过首先将其视图控制器推入导航控制器来以模态方式呈现 modalPresentationStyle 属性设置为 UIModalPresentationFormSheet

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:myViewController];
    navController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    navController.modalPresentationStyle = UIModalPresentationFormSheet;
    [self presentViewController:navController animated:YES completion:nil];

然后,在呈现的视图控制器中,我想检测自身外部的点击手势(正如我所说,我将其呈现为表单),所以我以这种方式设置了点击手势:

- (void)viewDidAppear:(BOOL)animated

   [super viewDidAppear:animated];

    self.tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                        action:@selector(handleTap:)];

    self.tapGestureRecognizer.numberOfTouchesRequired = 1;
    self.tapGestureRecognizer.numberOfTapsRequired = 1;
    self.tapGestureRecognizer.cancelsTouchesInView = NO;
    [self.view.window addGestureRecognizer:self.tapGestureRecognizer];


- (void)handleTap:(UITapGestureRecognizer*)sender

   if (sender.state == UIGestureRecognizerStateEnded) 
      CGPoint location = [sender locationInView:nil]; 

      if (![self.view pointInside:[self.view convertPoint:location fromView:self.view.window] withEvent:nil]) 
        [self.view.window removeGestureRecognizer:sender];
        [self dismissModalViewControllerAnimated:YES];
      
   

我以模态方式呈现的导航控制器,其根视图控制器是设置此手势识别器的控制器,它在层次结构中显示更多视图。当仅将根视图控制器推送到导航控制器堆栈上并且我在其外部使用点击手势时,它会被正确解除,并且我能够再次以模态方式呈现此根视图控制器。当我从根视图控制器导航并将另一个视图控制器推送到导航堆栈时,点击手势仍然有效,但是当我再次尝试显示表单时应用程序崩溃。

我应该如何处理这个手势以及我想要的具有导航层次结构的行为?

提前致谢

【问题讨论】:

【参考方案1】:

我认为您的问题是使用 self.view.window 删除手势识别器 - 当另一个控制器被推入堆栈时它将为零,因为只有屏幕上的视图具有非零窗口属性。尝试用 [UIApplication sharedApplication].delegate.window 替换它,看看是否能解决问题。

【讨论】:

我刚刚尝试过,它似乎不是(仅)因为那个......也许我对这种情况下的手势识别器行为感到困惑:我只设置了一个 @987654321 @ 及其在层次结构的根视图控制器中的动作目标,我认为,由于我想要检测的是在当前呈现的视图之外点击,这会起作用,但是......我应该在其余部分设置手势识别器吗?层次结构的视图控制器? @AppsDev,是的,你在你的 point inside 方法中也使用了 self,view.window,所以这也是一个问题。您可能必须在每个控制器中添加和删除它,因为您还引用了 self.view。【参考方案2】:

我遇到的崩溃的一个可能原因是忘记将您的视图控制器声明为其父控制器的 childViewController。

【讨论】:

以上是关于iOS 应用程序在点击手势事件时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在 XIB 中添加手势时,iOS 应用程序崩溃并显示消息“-[UITapGestureRecognizer setFrame:]”

为 iOS 应用程序实现侧边菜单,应用程序在显示手势时崩溃。

iOS10 UITextView 触摸事件崩溃

iOS解决单击手势和UITableView的点击事件冲突

iOS 手势操作和事件传递响应链

UITapGestureRecognizer 在多次点击时崩溃