iOS消息发送到解除分配的实例

时间:2012-10-20 18:34:34

标签: ios uigesturerecognizer modalviewcontroller viewdidappear

我有点难过。我有一个UIModalPresentationFormSheet并且我添加了一个手势识别器来处理如果用户选择表单外的任何地方而解雇表单。我还在表单顶部的导航栏中有一个取消按钮。当用户选择表单外的任何地方使用手势识别器来关闭表单时,一切正常。但当他们使用取消按钮,忽略手势识别器时,一旦表单关闭,我得到以下错误。我相信它从识别器发送到handleTapBehind方法。我不明白为什么,因为当视图被解除时,不应该调用viewWillAppear,这会将识别器分配给解除分配的方法(handleTapBehind)。

错误:

  

[CallWebViewViewController handleTapBehind:]:发送给的消息   解除分配的实例0x21ee5db0

代码:

- (void)viewDidAppear:(BOOL)animated {

[super viewDidAppear:animated];

if(UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM())
{
    if(![self.view.window.gestureRecognizers containsObject:recognizer])
    {
        recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapBehind:)];

        [recognizer setNumberOfTapsRequired:1];
        recognizer.cancelsTouchesInView = NO;
        [self.view.window addGestureRecognizer:recognizer];
    }
}
}

- (void)handleTapBehind:(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 dismissViewControllerAnimated:YES completion:nil];
        [self.view.window removeGestureRecognizer:recognizer];
    }
}
}

1 个答案:

答案 0 :(得分:1)

将以下内容添加到viewController的viewWillDisappear中:

recognizer.delegate=nil;

希望这有帮助。

PS:我不明白你的最后一句:

  

我不明白为什么,因为当视图被解除时,不应该调用viewWillAppear,它将识别器分配给解除分配的方法(handleTapBehind)。

特别是“将识别器分配给解除分配的方法”?