Открытие нового 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];
}
Другие вопросы по тегам