在运行时获取主情节提要

Posted

技术标签:

【中文标题】在运行时获取主情节提要【英文标题】:Get the main storyboard at runtime 【发布时间】:2013-10-11 21:36:29 【问题描述】:

我希望能够在运行时简单地调用 [UIStoryboard mainStoryboard] 来获取 iPad 或 iPhone 故事板。

【问题讨论】:

【参考方案1】:

这是一个 UIStoryboard 类别,它可以做到这一点:

UIStoryboard+LDMain.h

#import <UIKit/UIKit.h>

@interface UIStoryboard (LDMain)

+ (instancetype)LDMainStoryboard;

@end

UIStoryboard+LDMain.m

#import "UIStoryboard+LDMain.h"

UIStoryboard *_mainStoryboard = nil;

@implementation UIStoryboard (LDMain)

+ (instancetype)LDMainStoryboard 
    if (!_mainStoryboard) 
        NSBundle *bundle = [NSBundle mainBundle];
        NSString *storyboardName = [bundle objectForInfoDictionaryKey:@"UIMainStoryboardFile"];
        _mainStoryboard = [UIStoryboard storyboardWithName:storyboardName bundle:bundle];
    
    return _mainStoryboard;


@end

这是link to the gist

【讨论】:

框架类的类别应始终使用前缀以避免名称冲突。 谢谢。我已经进行了更改。 酷;不过,方法名称实际上是更重要的部分。 真的没有这么简单。这将为您提供主故事板的副本。如果你反复这样做,你每次都会得到故事板的新副本。 嗯,主要是?如果您已经通过常规应用程序启动加载了故事板,您将拥有它的两个副本。这可能比 N 个副本更好。 :)【参考方案2】:

如果情节提要尚未加载,您可以使用[UIStoryboard storyboardWithName:storyboardName bundle:bundle]

但是,如果有,这将加载一个新副本。

您也可以使用viewController.storyboard 来获取现有的。如果你有一个mainWindow 作为你的应用程序委托的一部分(你可能有),你可以获得rootViewController.storyboard

类似:

UIApplication *application = [UIApplication sharedApplication];
MyAppDelegate *myAppDelegate = ((MyAppDelegate *)application).delegate;
return myAppDelegate.mainWindow.rootViewController.storyboard;

如果没有,这可能对你有用:

UIApplication *application = [UIApplication sharedApplication];
UIWindow *backWindow = application.windows[0];
return backWindow.rootViewController.storyboard

【讨论】:

以上是关于在运行时获取主情节提要的主要内容,如果未能解决你的问题,请参考以下文章

为啥带有约束的情节提要对象在运行时无法正确显示?

iPhone 模拟器与主情节提要预览

Xcode 4 for Dummies:为啥应用程序运行时没有应用情节提要设置?

Xcode 快速导航栏在模拟器运行时消失,但在情节提要中不会

白条出现在情节提要中每个视图控制器的底部,但不影响运行时

ios8/xcode6.1:在情节提要中设置时在运行时忽略自定义字体