Проинформирование контроллера просмотра программно с помощью раскадровки из AppDelegate

Я занят созданием приложения - при первом запуске он просит пользователя сделать две вещи:

  • Выберите страну
  • Принять T & Cs

Оттуда он переходит к контроллеру домашнего вида.

Проблема, с которой я сейчас сталкиваюсь, - это нажать первый контроллер представления на экран из моего делегата приложения. Я использую раскадровки /Xcode 5/iOS7

Вот код, который я придумал:

UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle: nil];
BBCounterySettingsViewController *controller = (BBCounterySettingsViewController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"CountrySettings"];
[navigationController pushViewController:controller animated:NO];

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

* Завершение приложения из-за неотображенного исключения "NSInvalidArgumentException", причина: '- [UIViewController pushViewController: анимированный:]: непризнанный селектор, отправленный в экземпляр 0x8e9a400

У кого-нибудь есть идеи, что я делаю неправильно?

Ответ 1

Вы ожидаете, что self.window.rootViewController будет UINavigationController, но это a UIViewController. Это означает, что внешний контроллер представлений в вашем раскадровке неправильного типа.

Лучшим способом получения UINavigationController (который должен работать в этом случае) является использование свойства self.navigationController на любом UIViewController.

Из того, что я понимаю, вы хотите представить представление при первом запуске пользователя, чтобы пользователь мог выбрать какой-то материал. То, что вы должны сделать, представляет собой modal view controller, например:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//isFirstRun is some boolean you use to determine if it the first run
if(isFirstRun){
    BBCounterySettingsViewController *controller = (BBCounterySettingsViewController *)[mainStoryboard instantiateViewControllerWithIdentifier: @"CountrySettings"];
    [self.window.rootViewController presentViewController: controller animated:YES completion:nil];
}

Ответ 2

Вам нужно сделать две вещи:

  • В Storyboard вы упомянули имя контроллера (например, LoginView) и включили использование идентификатора раскадровки
  • Затем у вас есть пользовательская строка

    loginView = [storyboard instantiateViewControllerWithIdentifier:@"LoginView"];
    [(UINavigationController*)self.window.rootViewController pushViewController:loginView animated:NO];
    

Надеюсь, это поможет. Дайте мне знать, если у вас все еще есть проблема.

Ответ 3

[self performSegueWithIdentifier:@"buyListSegue" sender:sender];

Ответ 4

Я думаю, что идентификатор контроллера "CountrySettings" установлен на неправильный контроллер. Вы не получаете NavigationController, где вы можете позвонить pushViewController...