Открытие нового UIVIewController путем первой деактивации UIModalTransitionStylePartialCurl
У меня есть три UIViewController: MainViewController, CurledViewController и SecondayViewController.
На MainViewController у меня есть один UIButton в MainViewController, который отображает CurledViewController через:
curled = [[CurledViewController alloc] init];
[curled setModalTransitionStyle:UIModalTransitionStylePartialCurl];
[self presentModalViewController:curled animated:YES];
Из документации мне говорят:
Модальное представление, представленное с использованием этого перехода, само по себе лишено возможности представлять какие-либо дополнительные модальные представления.
Что мешает мне открыть SecondaryViewController, когда CurledViewController отображается таким образом. То, что я хотел бы сделать, это при выборе UIButton в CurledViewController, закрыть curl и открыть SecondaryViewController (будь то вызов из CurledViewController или MainViewController не имеет значения). После закрытия SecondaryViewController я бы хотел, чтобы CurledViewController был снова открыт.
В функции, связанной с UIButton в CurledViewController, я попытался сделать это через:
- (void)showSecondary:(UIButton *)sender {
[self.parentViewController dismissModalViewControllerAnimated:YES];
SecondaryViewController *secondaryView = [[SecondaryViewController alloc] initWithNibName:@"Secondary" bundle:Nil];
[self presentModalViewController:secondaryView animated:YES];
...
}
но мне все еще говорят,
Application tried to present a nested modal view controller while curled
Как мне открыть новый UIViewController таким способом?
Спасибо!
1 ответ
Проблема здесь в том, что ваш код для представления SecondaryViewController все еще выполняется из CurledViewController. Один из альтернативных подходов заключается в создании протокола CurledViewControllerDelegate. Сделайте MainViewController делегатом CurledViewController и вызовите ваш метод делегата из showSecondary.
В CurledViewController ваш метод может выглядеть так:
- (void)showSecondary:(UIButton *)sender {
[self.delegate dismissCurledViewController:self];
}
В MainViewController ваш метод делегата может выглядеть так:
- (void)dismissCurledViewController:(CurledViewController *)controller {
[self dismissModalViewControllerAnimated:NO];
SecondaryViewController *secondaryView = [[SecondaryViewController alloc] initWithNibName:@"Secondary" bundle:nil];
[self presentModalViewController:secondaryView animated:YES];
…
}
редактировать
Чтобы сохранить анимацию как при увольнении, так и при презентации нового контроллера модального представления, вам нужно будет ввести задержку, которая позволяет достаточно времени для завершения первой анимации. Вы можете сделать это, вызвав performSelector:withObject:afterDelay:
с соответствующим значением задержки. Однако этот подход подвержен ошибкам, поскольку предполагает, что первая анимация всегда будет иметь одинаковую продолжительность.
Как предложил Эндрю Пулио в другом вопросе, вы также можете попытаться переопределить viewDidAppear:
в вашем MainViewController, так что он ищет флаг, чтобы определить, должен ли быть представлен SecondaryViewController. Это все равно будет использовать подход делегата, о котором я упоминал выше, но MainViewController будет иметь следующие отличия:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if(showSecondaryViewController) {
SecondaryViewController *secondaryView = [[SecondaryViewController alloc] initWithNibName:@"Secondary" bundle:nil];
[self presentModalViewController:secondaryView animated:YES];
}
showSecondaryViewController = NO;
}
- (void)dismissCurledViewController:(CurledViewController *)controller {
showSecondaryViewController = YES;
[self dismissModalViewController:YES];
}