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!

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

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


person jkh    schedule 12.07.2013    source источник


Ответы (1)


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

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

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

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

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

person Nicholas Hart    schedule 12.07.2013