我有一个仅限iPhone的应用程序,大部分使用Interface builder
构建。
我为每个屏幕尺寸/设备都有一个故事板。
在AppDelegate
中,它会选择正确的故事板并加载它。
我已经重新设计了我的应用程序,现在又添加了iPad兼容性。
我添加了两个新故事板,将其大小修改为“iPad全屏”和“iPad Pro全屏”。
我已经复制了现有的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;
}
更新/解决方案:
正如下面提到的Bharat 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 :(得分:2)
请删除此条件。
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
仅当设备是iPhone时才是真的。
因此,您的iPad故事板尚未初始化。
希望这有帮助!