TabBarController -> NavigationController -> Несколько UIViewController (контроллеры rootview) с использованием Storyboard

Я разрабатываю приложение с использованием раскадровки, которое имеет следующую структуру:

- TabBarController (2 Tab Bars) - Initial View Controller
    o NavigationController1
       • RegistrationPage - UIViewController (candidate for rootview)
       • DoActivityPage - UIViewController (candidate for rootview)

    o NavigationController2
       • View Controller 1

Когда приложение запускается в первый раз, я хочу показать пользователю RegistrationPage, а в последующие разы пользователю будет представлен DoActivityPage. Поскольку обе эти страницы находятся на одном уровне, каждая из них является потенциальным кандидатом на роль корневого контроллера представления.

Я использую макет раскадровки, поэтому визуально я могу сделать только одно из представлений как rootViewController, что не служит моей цели. Итак, я знаю, что мне придется добиться этого программно, и я много пробовал в Google, но не смог найти способ сделать это.

Мой вопрос: как мне программно установить контроллер корневого представления (из нескольких контроллеров корневого представления) для контроллера навигации, имея в виду, что я использую раскадровку?

В настоящее время я вижу черную страницу, когда приложение запускается с выбранным элементом 1-й вкладки. Если я добавлю следующий код в AppDelegate.m, я увижу страницу, но пустые нижняя и верхняя панели:

UINavigationController *navController = (UINavigationController *)self.window.rootViewController;
RegistrationPage *rp = [navController.storyboard instantiateViewControllerWithIdentifier:@"RegistrationPage"];
navController.viewControllers = [NSArray arrayWithObjects: rp, nil];

@Michael Я пробовал подобный код раньше, но проблема в том, что, поскольку я использую раскадровку, единственный способ получить доступ к tabBarController - это:

self.window.rootViewController.tabBarController
UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:self.window.rootViewController.tabBarController];

И, когда я попытался использовать приведенный выше код, я получаю сообщение об ошибке. Приложение пыталось нажать на цель контроллер нулевого представления.


person Sategroup    schedule 22.12.2013    source источник
comment
Обратитесь к этой ссылке, возможно, она будет вам полезна stackoverflow. ком/вопросы/14246454/   -  person praveen    schedule 23.12.2013
comment
Эта ссылка не имеет отношения к моему вопросу, так как я могу легко управлять различными представлениями при нажатии кнопки, используя метод prepareForSegue. Но в моем случае кнопки нет. Просто корневой вид меняется при запуске приложения.   -  person Sategroup    schedule 25.12.2013


Ответы (1)


Обычно контроллер представления регистрации/входа не интегрирован в панель вкладок.
Это полностью отдельный контроллер представления (может содержаться в собственном контроллере навигации).
После запуска приложения вы должны проверить код, если регистрация/логин должен быть открыт и открыт как контроллер модального представления.

ИЗМЕНИТЬ
Предполагая, что вы инициализировали свойство tabBarController, свойство registrationViewController и метод isRegistered, который возвращает BOOL в вашем AppDelegate,
поместите следующий код внутри вашего метода application:didFinishLaunchingWithOptions: (прямо перед return YES;):

if ([self isRegistered] == NO) {
    UINavigationController *navController = [[UINavigationController alloc]
                                             initWithRootViewController:self.tabBarController];
    [self.tabBarController presentViewController:navController
                                        animated:NO
                                      completion:NULL];
}
  • Может быть, этот код лучше разместить, но это проще всего объяснить, предполагая, что я понятия не имею, какие классы у вас есть в вашем проекте.
person Michael Kessler    schedule 22.12.2013
comment
Я понимаю вашу точку зрения, что панель вкладок не знает о контроллере регистрации как о его части контроллера навигации. Но в моем случае TabBar знает о NavigatonController, а RegistrationController является независимым представлением. Итак, может быть, если вы можете опубликовать некоторый код, который поможет мне сделать RegistrationController частью NavigationController, что я должен иметь возможность использовать во время выполнения, потому что в соответствии со структурой, выделенной выше, у меня есть Registration And DoActivityPage, которая может захотеть быть корневым представлением для NavigationController. - person Sategroup; 25.12.2013