여기 다소 우울합니다. 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];
}
}
}
아니요 작동하지 않았습니다. –
viewWillDisappear가 호출되고 있는지 확인 했습니까? –
예. 호출 중입니다. –