Я немного преуменьшен здесь. У меня есть UIModalPresentationFormSheet
, и я добавил распознаватель жестов, чтобы обрабатывать отклонение листа формы, если пользователь выбирает где угодно вне листа формы. У меня также есть кнопка отмены на панели навигации в верхней части листа формы. Когда пользователь выбирает вне рамки листа, чтобы использовать распознаватель жестов для отклонения листа формы, все работает нормально. Но когда они используют кнопку отмены, игнорируя распознаватель жестов, как только лист формы закрыт, я получаю ошибку ниже. Я считаю, что его от распознавателя отправляют методу handleTapBehind. Я не понимаю, почему, хотя, поскольку, когда представление отклонено, viewWillAppear
не следует вызывать, который выделяет распознаватель на освобожденный метод (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? –
Да, это называется. –