IOS отклонить контроллер и представить контроллер с анимацией
У меня есть корневой контроллер представления, который представляет контроллер представления проверки подлинности. Как только пользователь аутентифицируется, мне нужно отклонить контроллер аутентификации и представить пользовательский контроллер (пример: на контроллере посадки, обычный пользовательский контроллер, профессиональный пользовательский контроллер). Я хотел бы, чтобы при отключении контроллера аутентификации отображался соответствующий контроллер (как если бы он был представлен до контроллера аутентификации).
Это два решения, которые я пробовал до сих пор. Оба показывают корневой контроллер представления между переходами.
в
-viewDidAppear
из корневого контроллера представления я представляю соответствующий контроллер (аутентификация или пользовательский контроллер).Я попытался отклонить и представить два контроллера, используя следующее:
[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];
}
}