Открытие нового UIVIewController путем первой деактивации UIModalTransitionStylePartialCurl - PullRequest
2 голосов
/ 11 августа 2011

У меня есть три UIViewController: MainViewController, CurledViewController и SecondayViewController.

На MainViewController У меня есть один UIButton в MainViewController, который отображает CurledViewController через:

curled = [[CurledViewController alloc] init];
[curled setModalTransitionStyle:UIModalTransitionStylePartialCurl];
[self presentModalViewController:curled animated:YES];

Из документации мне говорят:

Представлено модальное представлениеиспользование этого перехода само по себе препятствует представлению каких-либо дополнительных модальных представлений.

, что не позволяет мне открыть SecondaryViewController, когда CurledViewController отображается таким образом.То, что я хотел бы сделать, это при выборе UIButton в CurledViewController закрыть локон и открыть 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 Ответ

1 голос
/ 11 августа 2011

Проблема в том, что ваш код для представления 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];
}
...