添加了iPad故事板,现在:“预计会有一个根视图控制器......”

时间:2016-09-26 11:59:17

标签: ios xcode ipad storyboard appdelegate

我有一个仅限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

1 个答案:

答案 0 :(得分:2)

请删除此条件。

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)

仅当设备是iPhone时才是真的。

因此,您的iPad故事板尚未初始化。

希望这有帮助!