Objective-C - Уволить лист формы и лист страницы одновременно

У меня есть UINavigationController, в котором я нажимаю контроллер представления со стилем представления UIModalPresentationPageSheet.

Внутри контроллера представления этой страницы я представляю контроллер представления в стиле UIModalPresentationFormSheet.

Когда пользователь нажимает кнопку Готово на листе формы, я хочу закрыть лист формы и лист страницы.

В действии на кнопку Готово:

-(IBAction)onDone:(id)sender
{
  if(self->delegate && [self->delegate respondsToSelector:self->actionSelector])
  {
    [self->delegate performSelector:self->actionSelector withObject:[NSString stringWithString:self.textView.text]];
  }

  [self dismissViewControllerAnimated:YES completion:nil];
}

Этот делегат является контроллером представления страницы, и в селекторе я отклоняю страницу:

[self dismissViewControllerAnimated:YES completion:nil];

Когда я запускаю его, я получаю:

Warning: Attempt to dismiss from view controller <UINavigationController: 0xa9381d0> while a presentation or dismiss is in progress!

Я понимаю, почему это происходит - потому что селектор вызывается до того, как представление формы закрывается, но я не знаю лучшего способа обойти это.

Я попытался удалить dismiss в onDone и вызвать dismiss для обоих в вызове селектора (с анимированным:NO для листа формы), и это, кажется, работает, но я не знаю, должен ли я подходить так исправить это.

1 ответ

Решение

Попробуйте просто вызвать dismissViewControllerAnimated: завершение: на листе страницы. Согласно документации Apple:

"Если вы представляете несколько контроллеров представления подряд, тем самым создавая стек представленных контроллеров представления, вызов этого метода для контроллера представления, расположенного ниже в стеке, отклоняет его непосредственный дочерний контроллер представления и все контроллеры представления выше этого потомка в стеке. Когда это происходит, только самый верхний вид отклоняется в анимационном режиме, любые промежуточные контроллеры вида просто удаляются из стека. Самый верхний вид отклоняется с использованием его модального стиля перехода, который может отличаться от стилей, используемых другими контроллерами представления ниже в стеке."

Если это не совсем то поведение, которое вам нужно, то вы должны использовать аргумент обработчика завершения в dismissViewControllerAnimated: complete: для передачи в блоке, а затем исключить другой контроллер представления из обработчика завершения, например:

[formSheetViewController dismissViewControllerAnimated:YES completion:^{
    [pageSheetViewController dismissViewControllerAnimated:YES competion:nil];
}

Хотя на самом деле, я думаю, простое увольнение должно помочь вам. Еще хорошо понять, как работают обработчики завершения. Это позволяет вам выполнять некоторую работу после выполнения операции - очень удобно.

Другие вопросы по тегам