Я только что начал программировать на 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
. Это неправильно, приложение должно уже иметь ссылку на доску объявлений, но как я могу получить к ней доступ?
Update
Я разработал второй вопрос у меня был, как я нашел мой ответ здесь:
UIStoryboard: What's the Correct Way to Get the Active Storyboard?
NSBundle *bundle = [NSBundle mainBundle];
NSString *sbFile = [bundle objectForInfoDictionaryKey:@"UIMainStoryboardFile"];
UIStoryboard *sb = [UIStoryboard storyboardWithName:sbFile bundle:bundle];
выше будет создавать новую историю бортовой экземпляр; чтобы получить активный экземпляр, это гораздо проще:
UIStoryboard *sb = [[self.window rootViewController] storyboard];
В самом раскадровка файл вы должны установить идентификатор для вида, который вы хотите загрузить, например, LoginDialog
. После этого вы инстанцируете мнение так:
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];
'/ * Для раскадровки ... */self.window.rootViewController = (YourViewController *) [[UIStoryboard storyboardWithName: @" Main " bundle: nil] instantiateViewControllerWithIdentifier: @ "YourViewControllerID"]; ' –