iOS应用在点按手势事件时崩溃

时间:2013-08-24 20:33:50

标签: ios ipad uinavigationcontroller presentmodalviewcontroller uitapgesturerecognizer

我有一个针对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];
      }
   }
}

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

我应该如何处理此手势以及我想拥有导航层次结构的行为?

提前致谢

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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