Подтвердить что ты не робот

"Ожидается, что в окнах приложений будет установлен корневой контроллер в конце запуска приложения" ошибка только на 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?

4b9b3361

Ответ 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.