выбор альтернативного контроллера первого представления из раскадровки при запуске приложения

Я только начал заниматься программированием для iOS, и до сих пор руководства и ответы, которые я нашел здесь, очень помогали двигаться вперед. Однако эта конкретная проблема беспокоила меня всю ночь, и я не могу найти ответ, который «кажется правильным».

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

В проекте используются раскадровки — что, на мой взгляд, является отличной функцией — поэтому большая часть кода, который выбирает и загружает корневой контроллер представления, уже позаботилась. Я подумал, что лучшее место для добавления моей логики — это application:didFinishLaunchingWithOptions:метод AppDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
      (NSDictionary *)launchOptions
{
    // select my root view controller here based on credentials present or not
    return YES;
}

Но это вызвало два вопроса:

  1. Внутри этого конкретного метода делегата , контроллер корневого представления уже выбран (и загружен?) на основе раскадровки.Могу ли я перейти к более раннему месту в процессе загрузки, чтобы переопределить выбор первого контроллера представления, или это излишне усложнит ситуацию?

  2. Чтобы переопределить первый контроллер представления, мне нужна ссылка на раскадровку, но я не смог найти лучшего способа, чем использовать конструктор storyboardWithName:bundle:из UIStoryboard. . Это кажется неправильным, приложение уже должно иметь ссылку на раскадровку, но как я могу получить к ней доступ?

Обновление

Я решил вторую проблему, с которой столкнулся, так как нашел ответ здесь:

UIStoryboard: как правильно получить активную раскадровку?

NSBundle *bundle = [NSBundle mainBundle];
NSString *sbFile = [bundle objectForInfoDictionaryKey:@"UIMainStoryboardFile"];
UIStoryboard *sb = [UIStoryboard storyboardWithName:sbFile bundle:bundle];

Приведенное выше действие создаст новый экземпляр раскадровки; чтобы получить активный экземпляр, это намного проще:

UIStoryboard *sb = [[self.window rootViewController] storyboard];

В самом файле раскадровки вы должны установить идентификатор для представления, которое вы хотите загрузить, например. Диалог входа. После этого вы создаете представление следующим образом:

LoginViewController *login = [sb instantiateViewControllerWithIdentifier:@"LoginDialog"];
[self.window setRootViewController:login];

В другом контроллере представления достаточно следующего:

UIStoryboard *sb = self.storyboard;
LoginViewController *login = [sb instantiateViewControllerWithIdentifier:@"LoginDialog"];
[self presentViewController:login animated:NO completion:nil];

15
задан Community 23 May 2017 в 10:26
поделиться