在运行时获取主要故事板

Chr*_*nzo 17 cocoa-touch objective-c ios uistoryboard

我希望能够[UIStoryboard mainStoryboard]在运行时简单地打电话来获取iPad或iPhone故事板.

Chr*_*nzo 21

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

UIStoryboard + LDMain.h

#import <UIKit/UIKit.h>

@interface UIStoryboard (LDMain)

+ (instancetype)LDMainStoryboard;

@end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这是一个关于要点链接

  • 这不是真的很简单.这将为您提供主故事板的副本.如果你反复这样做,你每次都会获得故事板的新副本. (2认同)

Ste*_*her 12

[UIStoryboard storyboardWithName:storyboardName bundle:bundle]如果尚未加载故事板,则可以使用.

但是,如果有,则会加载新副本.

您也可以使用viewController.storyboard现有的.如果你有一个mainWindow应用程序代理的一部分(你可能会这样做),你可以得到rootViewController.storyboard它.

就像是:

UIApplication *application = [UIApplication sharedApplication];
MyAppDelegate *myAppDelegate = ((MyAppDelegate *)application).delegate;
return myAppDelegate.mainWindow.rootViewController.storyboard;
Run Code Online (Sandbox Code Playgroud)

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

UIApplication *application = [UIApplication sharedApplication];
UIWindow *backWindow = application.windows[0];
return backWindow.rootViewController.storyboard
Run Code Online (Sandbox Code Playgroud)