根据设备类型选择不同的故事板

Hes*_*gid 11 iphone ios uistoryboard

我有一个通用的应用程序,我手动加载我的主要故事板application:didFinishLaunchingWithOptions.

我有2个故事板的iPhone和iPad,因为他们~iPhone~iPad后缀.我正在使用以下方式加载我的故事板:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
self.initialViewController = [storyboard instantiateInitialViewController];
Run Code Online (Sandbox Code Playgroud)

这打印Unknown class ViewController in Interface Builder file.到控制台,显然它没有加载正确的故事板.但是,当我使用[UIStoryboard storyboardWithName:@"MainStoryboard~iPhone" bundle:nil];它工作正常,但当然只适用于iPhone.

我错过了什么?如何使用名称后缀自动选择正确的故事板?

fou*_*dry 12

我不知道基于文件名后缀自动选择故事板.你可以userInterfaceIdiom用来选择iPad和iPhone:

if ([[UIDevice currentDevice] userInterfaceIdiom] ==UIUserInterfaceIdiomPad) {
    UIStoryboard *storyboard = 
    [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil];
} else {
    [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
}
Run Code Online (Sandbox Code Playgroud)

但是如果你这样做是为了启动一个特定的视图控制器,你需要做的就是将"开始"箭头拖到故事板中的首选视图控制器

或者 - 在故事板中选择视图控制器,转到属性instpector并勾选 isInitialViewController


Vil*_*nne 5

这是您可以直接在 info.plist 文件中设置的另一件事。无需任何编程工作。查找名为“Main storyboard file base name”的属性,该属性将具有“Main”,默认情况下。

您可以添加另一个名为“主故事板文件基本名称(iPad)”的属性,然后该将用于 iPad。

这是 plist 中原始输出的样子:

<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIMainStoryboardFile~ipad</key>
<string>iPad</string>
Run Code Online (Sandbox Code Playgroud)

Afaik 也可以简单地添加一个名为 Main~iPad.storyboard 的第二个故事板(如果 UIMainStoryboardFile 键设置为 Main)。这将被用于 iPad。有一段时间没有测试这个。