Следующий сценарий:
В моем приложении для iPad есть SplitViewController в качестве основного VC. После запуска приложения (нового или фонового) у меня появляется полноэкранный режим входа в систему, который (очевидно) исчезает после ввода правильного пароля.
Проблема:
После входа в систему я хочу представить точно такой же экран, который был ДО перехода в фоновый режим. Это отлично работает, ЕСЛИ нет модального представления поверх разделенного представления (например, настройки и т. Д.).
Что я пробовал:
В AppDelegate я храню свой self.window.rootViewController, делаю логин vc как мой root VC, а после входа в систему я устанавливаю свой сохраненный root VC как фактический root VC. Но тогда вид (модальных) настроек не виден и не может быть снова открыт (Предупреждение: попытка представить VC на SplitVC, который уже представляет VC). На самом деле никакое другое модальное представление никогда не может быть открыто (если только приложение не закрыто должным образом).
Вторая попытка: вместо того, чтобы установить VC для входа в качестве корневого VC, я представил его как полноэкранный модальный вид поверх моего разделенного представления. Это дало то же сообщение об ошибке, что и первая попытка, но другой результат. После входа в фоновый режим вход в ВК вообще не будет представлен (поскольку уже был модальный вид).
Ответ 1 · рейтинг 1 · Kumar KL
Это связано с тем, что вы R пытаетесь представить VC, когда он фактически загружен как RootViewController .
Попробуйте использовать это:
Уисплитвиевконтроллер:
- После загрузки Root, а также MasterViewControlller вы сделаете UIViewControllers в качестве SubViews для вашего RootViewController. Из UIViewController, если вы хотите вернуться к RootViewController, попробуйте следующее:
[self.navigationController popToRootViewControllerAnimated:NO];
Я просто подумал, что у тебя похожая проблема.
Надеюсь, поможет.
Ответ 2 · рейтинг 1 · Marc
Я сделал следующее:
Создайте свойство, которое может хранить мои представленные модально VC (все они встроены в UINavigationController)
@property (nonatomic) UINavigationController *navController;
При создании логина vc я сохраняю свой модальный vc (который может быть nil, что нормально), отклоняю его и представляю логин vc
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
LoginViewController *loginViewController = [storyboard instantiateViewControllerWithIdentifier:@"LoginView"];
self.navController = (UINavigationController *)self.window.rootViewController.presentedViewController;
if (self.navController) {
[self.navController dismissViewControllerAnimated:NO completion:nil];
}
[self.window.rootViewController presentViewController:loginViewController animated:NO completion:nil];
И когда вход в систему выполнен успешно, я закрываю вход в систему и восстанавливаю модальную версию vc (если она доступна).
if (self.navController) {
[self.window.rootViewController presentViewController:self.navController animated:NO completion:nil];
}
Ответ 3 · brianLikeApple
Можете ли вы попробовать этот способ.
Root VC - это главный экран, а не страница входа.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Внутри приведенного выше кода представьте свою страницу входа в свой корневой VC.
- (void)applicationDidBecomeActive:(UIApplication *)application{
//Use below method or similar method to remove any presented VC on Root VC
if ([((UINavigationController *)self.window.rootViewController).visibleViewController isKindOfClass:[RLSplashViewController class]]) {
NSLog(@"AppDelegate dismiss splash page");
[self.window.rootViewController dismissViewControllerAnimated:NO completion:nil];
}
//And present your login VC
}
Внутри приведенного выше кода, во-первых и очень важно, удалите все VC, представленные в корневом VC. А затем предоставьте страницу входа в корневую виртуальную сеть.
В настоящее время я использую этот способ для представления страницы-заставки (из фона или новой), в вашем случае это страница входа. Надеюсь, это будет полезно для вашего случая :)