it-swarm.com.ru

Создание View Controller программно с раскадровкой из AppDelegate

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

  1. Выберите страну 
  2. Принять условия 

Оттуда это идет к контроллеру представления дома. 

Проблема, с которой я сталкиваюсь в настоящее время, заключается в том, чтобы выдвинуть первый контроллер представления на экран из моего делегата приложения. Я использую раскадровки/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: animated:]: нераспознанный селектор отправлен в экземпляр 0x8e9a400'

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

10
Robert J. Clegg

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

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

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

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

Есть две вещи, которые вам нужно сделать:

  1. В Storyboard вы упомянули имя контроллера (например, LoginView) и включили использование ID раскадровки
  2. Тогда у вас есть пользователь ниже строки

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

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

7
Nattudurai
[self performSegueWithIdentifier:@"buyListSegue" sender:sender];
0
Gank

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

0
regetskcob