Я только начал заниматься программированием для 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;
}
Но это вызвало два вопроса:
Внутри этого конкретного метода делегата , контроллер корневого представления уже выбран (и загружен?) на основе раскадровки.Могу ли я перейти к более раннему месту в процессе загрузки, чтобы переопределить выбор первого контроллера представления, или это излишне усложнит ситуацию?
Чтобы переопределить первый контроллер представления, мне нужна ссылка на раскадровку, но я не смог найти лучшего способа, чем использовать конструктор 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];