XCode如何加载主要的故事板?
当我使用storyboard在XCode 4.6中创build一个新的单视图应用程序时,我们可以看到主函数使用应用程序委托来创build一个新的应用程序,如下所示:
return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));
但是,如果我们看MyAppDelegate.h和MyAppDelegate.m,在代码中没有任何地方引用MainStoryboard.storyboard。 这不同于非故事板版本,我们可以find以编程方式加载nib文件的代码行。
所以我的问题是,如何加载故事板? (我应该在哪里find它?)
谢谢
查看项目的目标设置
注意主要故事板设置。
如果你想自己做这个代码,你会做类似的事情。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]]; UIViewController *vc = [storyboard instantiateInitialViewController]; // Set root view controller and make windows visible self.window.rootViewController = vc; [self.window makeKeyAndVisible]; return YES; }
看看UIApplicationMain的讨论:
讨论
该函数实例化来自主类的应用程序对象,并实例化来自给定类的委托(如果有)并设置应用程序的委托。 它还设置了主事件循环,包括应用程序的运行循环,并开始处理事件。 如果应用程序的Info.plist文件指定要加载的主要nib文件,则通过包含NSMainNibFile键和该值的有效nib文件名称,该函数将加载该nib文件。
当调用UIApplicationMain时,加载一个包含所有应用程序信息的plist文件:
这就是它“理解”xib / storyboard文件需要加载的方式。
它从您的info.plist文件的UIMainStoryboardFile设置开始。 Xcode然后创build一个主窗口,实例化你的第一个视图控制器,并将其添加到窗口。 您仍然可以使用类似于.nib的代码来执行此操作
UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; UIViewController* initialView = [storyboard instantiateInitialViewController];
如果你想用Swift实例化
var storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) var vc : AnyObject! = storyboard.instantiateInitialViewController() self.window!.rootViewController = vc as UIViewController self.window!.makeKeyAndVisible()
在Xcode中,确定主要故事板的可读的Info.plist部分是:
Main storyboard file base name
在纯文本中,键是UIMainStoryboardFile
:
<key>UIMainStoryboardFile</key> <string>Main</string>
晚了点派对,但你可以从窗口viewController,如下所示
@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { var viewController = window?.rootViewController as? ViewController if let viewController = viewController { // do awesome stuff } return true } }