"Ожидается, что в окнах приложений будет установлен корневой контроллер в конце запуска приложения" ошибка только на iPad
Я пытаюсь преобразовать приложение iPhone только в универсальное приложение. Я переключил устройства на 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;
}
EDIT: У меня только один контроллер корневого представления, размер которого соответствует iPhone, называемому RootViewController. Но он все равно должен загружаться, не так ли? Или, если это не так, как я могу создать его для iPad?
Ответы
Ответ 1
Измените следующую строку:
[_window addSubview:[_navigationController view]];
в
_window.rootViewController = _navigationController;
или, если вам нужна совместимость с iOS 3:
if ([_window respondsToSelector:@selector(setRootViewController:)]) {
_window.rootViewController = _navigationController;
} else {
[_window addSubview:_navigationController.view];
}
Ответ 2
Вам нужно создать 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;
}
Ответ 3
В iOS 4 и более поздних версиях UIWindow
имеет свойство rootViewController
. Это UINavigationController
, который выталкивает UIViewController
, отображаемый при запуске приложения. В Xcode IB, выбрав Initial Scene: Контроллер начального представления для UINavigationController
устанавливает все без кода.
Ответ 4
Из созданного MainWindow-iPad.xib в Interface Builder добавьте объект View Controller в IB, а также объект под представлением View. Для объекта установите его классом в AppDelegate, для контроллера просмотра установите класс в ViewController (i Identity Inspector) и укажите имя элемента в Инспекторе атрибутов. Вы можете посмотреть MainWindow.nib для устройства, с которого вы конвертировались, чтобы увидеть различия.
Изменить: я забыл упомянуть о некоторых важных шагах. Вам также необходимо установить класс "Владелец файла" в "UIApplication" в IB и установить соответствующие точки доступа для App Delegate и View Controller. Опять же, в IB, проще всего взглянуть на Инспектор соединений для MainWindow, который у вас есть, и подражать ему. Если у вас есть другой наконечник, характерный для iPad, отличный от MainWindow-iPad.nib(т.е. ViewController-iPad.nib), обязательно выберите его "Владелец файла" и укажите его на представление и соответствующим образом настройте его.
Ответ 5
Я пробовал ваши предложения, но никто из них не работал у меня, извините.:/Я в итоге просто сделал представление вручную в коде без конструктора интерфейса:
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
// Setup view for iPad
} else
// Setup view for iPhone and iPod Touch
}
который, как я думал, будет намного сложнее, чем на самом деле.
Обратите внимание: если вы используете этот метод, вы все равно можете подключить все в конструкторе интерфейсов и просто изменить кадр объектов в этих блоках, если у вас будут одинаковые объекты на iPhone и iPad.