Контроллер просмотра входа через модальный контроллер просмотра

Следующий сценарий:

В моем приложении для iPad есть SplitViewController в качестве основного VC. После запуска приложения (нового или фонового) у меня появляется полноэкранный режим входа в систему, который (очевидно) исчезает после ввода правильного пароля.

Проблема:

После входа в систему я хочу представить точно такой же экран, который был ДО перехода в фоновый режим. Это отлично работает, ЕСЛИ нет модального представления поверх разделенного представления (например, настройки и т. Д.).

Что я пробовал:

В AppDelegate я храню свой self.window.rootViewController, делаю логин vc как мой root VC, а после входа в систему я устанавливаю свой сохраненный root VC как фактический root VC. Но тогда вид (модальных) настроек не виден и не может быть снова открыт (Предупреждение: попытка представить VC на SplitVC, который уже представляет VC). На самом деле никакое другое модальное представление никогда не может быть открыто (если только приложение не закрыто должным образом).

Вторая попытка: вместо того, чтобы установить VC для входа в качестве корневого VC, я представил его как полноэкранный модальный вид поверх моего разделенного представления. Это дало то же сообщение об ошибке, что и первая попытка, но другой результат. После входа в фоновый режим вход в ВК вообще не будет представлен (поскольку уже был модальный вид).


person Marc    schedule 01.07.2013    source источник


Ответы (3)


Это связано с тем, что вы R пытаетесь представить VC, когда он фактически загружен как RootViewController .

Попробуйте использовать это:

Уисплитвиевконтроллер:

  • После загрузки Root, а также MasterViewControlller вы сделаете UIViewControllers в качестве SubViews для вашего RootViewController. Из UIViewController, если вы хотите вернуться к RootViewController, попробуйте следующее:
[self.navigationController popToRootViewControllerAnimated:NO];

Я просто подумал, что у тебя похожая проблема.

Надеюсь, поможет.

person Kumar KL    schedule 01.07.2013
comment
Я не пытаюсь представить какой-либо vc, который в настоящее время является корневым vc. Я отредактировал свой вопрос, так как он кажется запутанным (см. часть вторая попытка). Кроме того, где я должен поставить эту строку? - person Marc; 01.07.2013

Я сделал следующее:

Создайте свойство, которое может хранить мои представленные модально 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];
}
person Marc    schedule 01.07.2013

Можете ли вы попробовать этот способ.

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. А затем предоставьте страницу входа в корневую виртуальную сеть.

В настоящее время я использую этот способ для представления страницы-заставки (из фона или новой), в вашем случае это страница входа. Надеюсь, это будет полезно для вашего случая :)

person brianLikeApple    schedule 01.07.2013
comment
Спасибо, сейчас я придерживаюсь аналогичного подхода - person Marc; 01.07.2013