Проинформирование контроллера просмотра программно с помощью раскадровки из 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
...