2016-09-26 10 views
0

У меня было приложение для iPhone, построенное по большей части с помощью Interface builder.Добавлены раскадровки iPad, теперь: «ожидается, что у вас есть контроллер корневого представления ...»

У меня есть раскадровка для каждого экрана/устройства. В AppDelegate он выбирает правильную раскадровку и загружает ее.

С тех пор я изменил свое приложение и теперь добавил совместимость с iPad.

Я добавил две новые раскадровки, исправил их размер до «iPad Full Screen» и «iPad Pro Full Screen».

Я скопировал в существующие раскадровки iPhone и отметил первую плату как «Контроллер начального вида». Я также следил за THIS POST и открывал раскадровки в качестве исходного кода и обновлял цель от по умолчанию до iPad.

Когда я запускаю приложение на IPad в, я просто черный экран со следующей ошибкой:

Application windows are expected to have a root view controller at the end of application launch.

Почему это происходит?

Это единственная вещь, которую я изменил в моей AppDelegate, чтобы выбрать правильную раскадровку:

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

UIViewController *initialViewController = nil; 
CGSize result = [[UIScreen mainScreen] bounds].size; 

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){ 

    if(result.height == 480){ 
     NSLog(@"iPhone 3.5 Inch"); 
     UIStoryboard *i4SB = [UIStoryboard storyboardWithName:@"iPhone35" bundle:nil]; 
     initialViewController = [i4SB instantiateInitialViewController]; 
    } 
    if(result.height == 568){ 
     NSLog(@"iPhone 4 Inch"); 
     UIStoryboard *i5SB = [UIStoryboard storyboardWithName:@"iPhone4" bundle:nil]; 
     initialViewController = [i5SB instantiateInitialViewController]; 
    } 
    if(result.height == 667){ 
     NSLog(@"iPhone 4.7 Inch"); 
     UIStoryboard *i47SB = [UIStoryboard storyboardWithName:@"iPhone47" bundle:nil]; 
     initialViewController = [i47SB instantiateInitialViewController]; 
    } 
    if(result.height == 736){ 
     NSLog(@"iPhone 5.5 Inch"); 
     UIStoryboard *i55SB = [UIStoryboard storyboardWithName:@"iPhone55" bundle:nil]; 
     initialViewController = [i55SB instantiateInitialViewController]; 
    } 

    //added iPad compatibility 
    if(result.height == 1024){ 
     NSLog(@"iPad Mini(2,3,4) or iPad Air(1,2) or iPad(3,4) or iPad Pro(9.7inch)"); 
     UIStoryboard *iPadMiniSB = [UIStoryboard storyboardWithName:@"iPadFull" bundle:nil]; 
     initialViewController = [iPadMiniSB instantiateInitialViewController]; 
    } 
    if(result.height == 1366){ 
     NSLog(@"iPad Pro(12.9 Inch)"); 
     UIStoryboard *iPadProSB = [UIStoryboard storyboardWithName:@"iPadPro" bundle:nil]; 
     initialViewController = [iPadProSB instantiateInitialViewController]; 
    } 
} 

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
self.window.rootViewController = initialViewController; 
[self.window makeKeyAndVisible]; 
return YES; 
} 

ОБНОВЛЕНО/РЕШЕНИЕ:

Как Бхарат Nakum упомянуто ниже, вы можете удалить UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone состояние.

Конечно, вы также можете добавить дополнительное условие для iPad (это то, что я сделал).

Он теперь выглядит следующим образом:

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){ 
    //set iPhone device storyboards here 
} 
else if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){ 
    //set iPad device storyboards here 
} 

Это подтверждается также в качестве ответа here.

+0

Чувак, для любви к Богу, изучите автоспуск! очень плохая практика иметь раскадровку для каждого размера экрана. –

+0

Я ненавижу автоматический макет. Никогда не кажется хорошим во всех устройствах. (Кроме того, для целей этого приложения это действительно не имеет значения в любом случае). Это то, что я буду делать в будущем, без сомнения. – Reanimation

ответ

2

Пожалуйста, удалите это условие.

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)

Это верно только тогда, когда устройство iPhone.

Итак, ваши раскадровки для iPad не инициализируются.

Надеюсь, это поможет!