ios (раскадровка) — отклонение sourceViewController после того, как destinationViewController представлен в UIStoryboardSegue

#storyboard #uistoryboardsegue

#раскадровка #uistoryboardsegue

Вопрос:

Я хотел бы отклонить sourceViewController (VC2) после представления destinationViewController(VC3)

введите описание изображения здесь

Если я использую этот код, destinationViewController(VC3) вообще не будет представлен:

 - (void)perform
{
    COSignLogInViewController* sourceViewController = [self sourceViewController];
    COSignLogInViewController* destinationViewController = [self destinationViewController] ;

    [UIView animateWithDuration:0.3
                     animations:^{
                         my animation
                     }
                     completion:^(BOOL finished){
                         [sourceViewController presentModalViewController:destinationViewController animated:NO];
                         [sourceViewController dismissViewControllerAnimated:NO completion:nil];

                     }];


}
  

Если я использую этот код, destinationViewController(VC3) представлен, но сразу отклоняется, и отображается начальный VC (VC1):

 - (void)perform
{
    COSignLogInViewController* sourceViewController = [self sourceViewController];
    COSignLogInViewController* destinationViewController = [self destinationViewController] ;

    [UIView animateWithDuration:0.3
                     animations:^{
                         my animation
                     }
                     completion:^(BOOL finished){
                         [sourceViewController presentModalViewController:destinationViewController animated:NO];
                         [sourceViewController.presentingViewController dismissViewControllerAnimated:NO completion:nil];

                     }];


}
  

Комментарии:

1. Является ли VC2 контроллером навигации?

2. @mxb, VC1 запускается контроллером навигации. VC1, VC2, VC3 являются контроллерами просмотра

3. вы пытались представить modalViewController из VC1?

4. @mxb Могу ли я получить к нему доступ при переходе между VC2 и VC3?

5. не через Storyboard API, вам нужно будет передать ссылку VC1 на VC2 перед отображением VC2

Ответ №1:

Это невозможно, потому что VC2 является суперклассом для VC3, если вы отклоняете суперкласс, а представленный подкласс недоступен.

поэтому вы должны использовать

 VC1 ->(use push view controller) -> VC2 -> (use present view controller) -> VC3
  

Комментарии:

1. Может быть, в переходе я могу подключить V1 к V3, а затем отклонить V2?

2. вы не сразу отклонили [sourceViewController dismissViewControllerAnimated: НЕТ завершения: ноль]; Но используется для пользовательской кнопки «Назад». теперь ваш код сработал.

Ответ №2:

Я отклонил sourceViewController и добавил destinationViewController в NavigationController

 - (void)perform
{
    COSignLogInViewController* sourceViewController = [self sourceViewController];
    COSignLogInViewController* destinationViewController = [self destinationViewController] ;


    [UIView animateWithDuration:0.3
                     animations:^{
                         my animation
                     }
                     completion:^(BOOL finished){
                         [sourceViewController dismissViewControllerAnimated:NO completion:nil];
                         COAppDelegate *del = (COAppDelegate *)[UIApplication sharedApplication].delegate;
                         [del.navigationController presentModalViewController:destinationViewController animated:NO];

                     }];
}
  

Ответ №3:

Вы можете устранить проблему, вызываемую presentModalViewController при первом ViewController вызове. Если второй контроллер просмотра не имеет ссылки на первый контроллер просмотра, вы могли бы добавить свойство, которое будет назначено перед отображением второго контроллера просмотра или доступом к главному контроллеру просмотра из делегата приложения, если этот контроллер является первым в приложении.