0

여기 다소 우울합니다. UIModalPresentationFormSheet이 있는데 사용자가 양식 시트 외부의 아무 곳이나 선택하면 양식 시트를 닫는 것을 처리하기 위해 제스처 인식기가 추가되었습니다. 나는 또한 양식 시트 상단의 탐색 표시 줄에 취소 버튼이 있습니다. 사용자가 제스처 인식기를 사용하여 양식 시트를 닫으려면 양식 시트 외부의 아무 곳이나 선택하면 모든 것이 올바르게 작동합니다. 그러나 제스처 인식기를 무시하고 취소 버튼을 사용하면 양식 시트가 닫히면 아래 오류가 표시됩니다. 인식기에서 handleTapBehind 메서드로 보내고 있다고 생각합니다. 그 이유는 이해가 안되는데 왜냐하면 뷰가 닫히면 은 인식자를 할당 해제 된 메소드 (handleTapBehind)에 할당해야한다고해서는 안됩니다.iOS 메시지가 할당 취소 된 인스턴스에 전송되었습니다.

오류 :

[CallWebViewViewController handleTapBehind:]: message sent to deallocated instance 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

은 당신의 ViewController의 viewWillDisappear에 다음을 추가 :이 도움이

recognizer.delegate=nil; 

희망.

PS :

I dont understand why though because when the view is dismissed, the viewWillAppear should not be called which is allocating the recognizer to a deallocated method (handleTapBehind).

특히 "는 할당 해제 방법 인식기를 할당한다"나는 당신의 마지막 문장을 이해하지?

+0

아니요 작동하지 않았습니다. –

+0

viewWillDisappear가 호출되고 있는지 확인 했습니까? –

+0

예. 호출 중입니다. –