IOS отклонить контроллер и представить контроллер с анимацией

У меня есть корневой контроллер представления, который представляет контроллер представления проверки подлинности. Как только пользователь аутентифицируется, мне нужно отклонить контроллер аутентификации и представить пользовательский контроллер (пример: на контроллере посадки, обычный пользовательский контроллер, профессиональный пользовательский контроллер). Я хотел бы, чтобы при отключении контроллера аутентификации отображался соответствующий контроллер (как если бы он был представлен до контроллера аутентификации).

Это два решения, которые я пробовал до сих пор. Оба показывают корневой контроллер представления между переходами.

  1. в -viewDidAppear из корневого контроллера представления я представляю соответствующий контроллер (аутентификация или пользовательский контроллер).

  2. Я попытался отклонить и представить два контроллера, используя следующее:

    [authenticationController dismissViewControllerAnimated:<NO|YES> completion:^{
        [userController presentViewController:viewController animated:animated completion:nil];
    }];
    

TLDR:

У меня есть модальная иерархия представления, которая начинается так rootViewController->viewController1 и я хочу перейти к rootViewController->viewController2 где viewController1 оживляет вниз, чтобы показать viewController2

3 ответа

Я думаю presentViewController не поддерживает вставку viewController ниже верхнего представленного ViewController, который здесь является контроллером аутентификации. Если у вас есть навигационный контроллер для rootViewController, вы можете попробовать pushViewController:animated: прежде чем отключить проверку подлинности контроллера, и нажмите анимацию может быть НЕТ;

Как только пользователь завершит аутентификацию, установите для вас флаг значимого значения, а затем, скажем, когда он нажмет OK или Submit, вы можете проверить и установить флаг.

Оттуда вы создадите один из трех контроллеров представления и поместите его в стек навигации - сделайте это с помощью раскадровки, если хотите, установив значение идентификатора раскадровки, а затем создайте экземпляр VC с идентификатором раскадровки.

Если вам нужно больше разъяснений или если это не правильный путь, дайте мне знать.

РЕДАКТИРОВАТЬ: как только вы создадите экземпляр, вам нужно будет представить контроллер представления с анимацией

Документация для -dismissViewControllerAnimated:completion: состояния:

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

Так что одним из способов достижения такого поведения было бы организовать ваши контроллеры вида следующим образом:

Скриншот раскадровки

Вы ставите контроллер вида vc2 что вы хотите показать после входа в систему на первой позиции. В vc2"s -viewWillAppear метод, который вы пересылаете vc1 если пользователь не авторизован:

- (void)viewWillAppear {
    if (!userLoggedIn) {
        UIViewController *vc1 = [[YourViewControllerClass1 alloc] init];
        [self presentViewController:vc1  animated:YES completion:nil];
    }
}

Когда пользователь касается Show Login VC кнопка в vc1 Вы представляете контроллер вида входа в систему оттуда:

- (IBAction)touchUpInsideShowLoginVCButton:(id)sender {
    UIViewController *loginVC = [[YourLoginViewControllerClass alloc] init];
    loginVC.delegate = self.presentingViewController;
    [self presentViewController:loginVC  animated:YES completion:nil];
}

Вы также установили vc2 как loginVCделегат здесь, потому что вам нужна ссылка на vc2 в вашем loginVC, (Вам нужно определить свойство delegate в.h файле loginVC:)

@property (strong, nonatomic) UIViewController *delegate;

Наконец, когда пользователь касается Login кнопка и вход в систему успешен, вы одновременно отклоняете два контроллера представления (просто вызывая -dismissViewControllerAnimated:completion: на vc2 который является самым низким в иерархии), чтобы выявить vc2 в первый раз.

- (IBAction)touchUpInsideLoginButton:(id)sender {
    // ... your login code
    if (loginSuccessful) {
        [self.delegate dismissViewControllerAnimated:YES completion:nil];
    }
}
Другие вопросы по тегам