11

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

我有 2 个带有~iPhone~iPad后缀的 iPhone 和 iPad 故事板。我正在使用以下方式加载我的故事板:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
self.initialViewController = [storyboard instantiateInitialViewController];

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

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

4

4 回答 4

12

我不知道根据文件名后缀自动选择情节提要。您可以使用userInterfaceIdiomiPad 和 iPhone 来选择:

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

但是,如果您这样做是为了使用特定的视图控制器启动,您需要做的就是将“开始”箭头拖到情节提要中的首选视图控制器

或者 - 在情节提要中选择视图控制器,转到属性检查器并勾选isInitialViewController

于 2013-02-03T12:09:55.587 回答
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>

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

于 2015-07-02T18:16:18.880 回答
0

// 在 appdelegate 类中,在启动应用程序时选择指定的故事板。

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

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    {
        storyboard1 = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:[NSBundle mainBundle]];
    }
    else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    {
        storyboard1 = [UIStoryboard storyboardWithName:@"Main_iPad" bundle:[NSBundle mainBundle]];
    }
    UIViewController *vc = [storyboard instantiateInitialViewController];

    // Set root view controller and make windows visible
    self.window.rootViewController = vc;
    [self.window makeKeyAndVisible];

    return YES;
}
于 2014-12-04T05:55:15.063 回答
0

你可以这样命名你的故事板

  • Main.storyboard(适用于 iPhone)
  • Main_iPad.storyboard(适用于 iPad)

并像这样选择它们

- (UIStoryboard *)deviceStoryboardWithName:(NSString *)name bundle:(NSBundle *)bundle {
    if (IS_IPAD) {
        NSString *storyboardIpadName = [NSString stringWithFormat:@"%@_iPad", name];
        NSString *path = [[NSBundle mainBundle] pathForResource:storyboardIpadName ofType:@"storyboardc"];

        if (path.length > 0) {
            return [UIStoryboard storyboardWithName:storyboardIpadName bundle:bundle];
        }
    }


    return [UIStoryboard storyboardWithName:name bundle:bundle];
}
于 2015-07-02T17:25:59.360 回答