Я только что начал программировать на 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];
В самом файле панели рассказов вам необходимо установить идентификатор для представления, которое вы хотите загрузить, например. 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];