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];
}
Хотя на самом деле, я думаю, простое увольнение должно помочь вам. Еще хорошо понять, как работают обработчики завершения. Это позволяет вам выполнять некоторую работу после выполнения операции - очень удобно.