Ошибка «У окон приложения должен быть контроллер корневого представления в конце запуска приложения» ошибка только на iPad - PullRequest
19 голосов
/ 03 января 2012

Я пытаюсь преобразовать только приложение для iPhone в приложение Universal.Я переключил устройства на Universal и позволил Xcode сделать свое дело, создав для меня MainWindow-iPad.xib, и теперь, когда я запускаю приложение в симуляторе iPhone, оно работает нормально, но когда я запускаю его в симуляторе iPad, я получаюэкран и ошибка Application windows are expected to have a root view controller at the end of application launch.Я читал некоторые другие посты об этой же проблеме, но ни один из них не ограничивается одним устройством.

Вот мой метод application:didFinishLaunchWithOptions::

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

 /* some dropbox setup stuff */


// INIT VIEW AND CORE DATA
RootViewController *rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];

NSManagedObjectContext *context = [self managedObjectContext];
if (!context) {
    // Handle the error.
}

rootViewController.managedObjectContext = context;

UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
self.navigationController = aNavigationController;

[_window addSubview:[_navigationController view]];
[_window makeKeyAndVisible];

[rootViewController release];
[aNavigationController release];

return YES;
}

РЕДАКТИРОВАТЬ: у меня только одинконтроллер корневого представления, размер которого для iPhone называется RootViewController.Но он все равно должен загружаться, не так ли?Или, если не следует, как мне создать его для iPad?

Ответы [ 5 ]

52 голосов
/ 03 января 2012

Измените следующую строку:

[_window addSubview:[_navigationController view]];

до:

_window.rootViewController = _navigationController;

или, если вам нужна совместимость с iOS 3:

if ([_window respondsToSelector:@selector(setRootViewController:)]) {
    _window.rootViewController = _navigationController;
} else {
    [_window addSubview:_navigationController.view];
}
2 голосов
/ 11 сентября 2012

Из сгенерированного MainWindow-iPad.xib в Интерфейсном Разработчике добавьте объект View Controller в IB, а также Object под View.Для объекта установите для его класса значение AppDelegate, для контроллера представления установите для этого класса значение ViewController (i Identity Inspector) и укажите имя пера в Intributes Inspector.Вы можете посмотреть на MainWindow.nib для устройства, с которого вы конвертировали, чтобы увидеть различия.

Редактировать: я забыл упомянуть некоторые важные шаги.Вам также нужно будет установить для класса «Владелец файла» значение «UIApplication» в IB и установить соответствующие выходные каналы для App Delegate и View Controller.Опять же, в IB проще всего взглянуть на Инспектор соединений для имеющегося у вас пера MainWindow и эмулировать его.Если у вас есть другое перо, специфичное для iPad, отличное от MainWindow-iPad.nib (то есть ViewController-iPad.nib), обязательно выберите его владельца файла, укажите его на представление и установите соответствующий класс тоже.

2 голосов
/ 04 января 2012

В iOS 4 и более поздних версиях UIWindow имеет настраиваемое свойство rootViewController.Это UINavigationController, который выдвигает UIViewController, отображаемое при запуске приложения.В Xcode IB, выбрав Initial Scene: начальный просмотр контроллера для UINavigationController устанавливает все без кода.

2 голосов
/ 03 января 2012

Вам нужно создать RootViewController с файлом xib для iPad, в противном случае вы получите эту ошибку.Ниже приведен код шаблона, предоставленный Xcode для универсального приложения.Если вы отладите приложение в симуляторе iPad и укажете отладчику запустить создание контроллера представления с файлом iPhone xib, вы увидите точную ошибку.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        self.viewController = [[SYKViewController alloc] initWithNibName:@"SYKViewController_iPhone" bundle:nil];
    } else {
        self.viewController = [[SYKViewController alloc] initWithNibName:@"SYKViewController_iPad" bundle:nil];
    }
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}
0 голосов
/ 06 апреля 2012

Я попробовал ваши предложения, но ни одно из них не помогло мне, извините.: / В итоге я просто сделал представление вручную в коде без компоновщика интерфейса:

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
    // Setup view for iPad
} else
    // Setup view for iPhone and iPod Touch
}

, что, как я думал, будет намного сложнее, чем на самом деле.

Обратите внимание, что если вы используете этоТаким образом, вы все равно можете подключить все в конструкторе интерфейсов и просто изменить каркас объектов в этих блоках, если у вас будут одинаковые объекты на iPhone и iPad.

...