У меня было приложение для 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.
Чувак, для любви к Богу, изучите автоспуск! очень плохая практика иметь раскадровку для каждого размера экрана. –
Я ненавижу автоматический макет. Никогда не кажется хорошим во всех устройствах. (Кроме того, для целей этого приложения это действительно не имеет значения в любом случае). Это то, что я буду делать в будущем, без сомнения. – Reanimation