65

当我在 Xcode 4.6 中使用 storyboard 创建一个新的单视图应用程序时,我们可以看到 main 函数使用应用程序委托创建了一个新应用程序,如下所示:

return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));

但是,如果我们查看 MyAppDelegate.h 和 MyAppDelegate.m,代码中没有任何地方引用 MainStoryboard.storyboard。这与非故事板版本不同,在非故事板版本中,我们可以找到以编程方式加载 nib 文件的代码行。

所以我的问题是,故事板是如何加载的?(我应该在哪里找到它?)

4

7 回答 7

75

查看项目的目标设置

在此处输入图像描述

注意 Main Storyboard 设置。

如果您想自己在代码中执行此操作,则可以执行类似的操作。

- (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;
}
于 2013-05-22T22:37:38.790 回答
9

看看UIApplicationMain讨论:

讨论
此函数从主体类实例化应用程序对象并从给定类实例化委托(如果有)并为应用程序设置委托。它还设置主事件循环,包括应用程序的运行循环,并开始处理事件。如果应用程序的 Info.plist 文件指定要加载的主 nib 文件,通过包含 NSMainNibFile 键和值的有效 nib 文件名,此函数将加载该 nib 文件。

UIApplicationMain被调用时,会加载一个包含所有应用程序信息的 plist 文件:

在此处输入图像描述

这就是它“理解”需要加载 xib/storyboard 文件的方式。

于 2013-05-22T22:39:29.600 回答
7

它从 info.plist 文件中的 UIMainStoryboardFile 设置开始。然后 Xcode 创建一个主窗口,实例化您的第一个视图控制器,并将其添加到窗口中。您仍然可以在类似于 .nib 的代码中使用

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController* initialView = [storyboard instantiateInitialViewController];
于 2013-05-22T22:37:18.950 回答
5

在 Xcode 中,决定主故事板的人类可读的 Info.plist 部分是:

Main storyboard file base name

在纯文本中,关键是UIMainStoryboardFile

<key>UIMainStoryboardFile</key>
<string>Main</string>
于 2016-08-22T22:52:09.170 回答
4

如果你想用 Swift 实例化

var storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
var vc : AnyObject! = storyboard.instantiateInitialViewController()
self.window!.rootViewController = vc as UIViewController
self.window!.makeKeyAndVisible()
于 2014-06-11T03:14:28.170 回答
3

在 Xcode 11.3.1 中,仅更改Main storyboard 文件基本名称是不够的,Application Scene Manifest中的Storyboard Name配置也应该更改。

    <key>UIApplicationSceneManifest</key>
    <dict>
        <key>UIApplicationSupportsMultipleScenes</key>
        <false/>
        <key>UISceneConfigurations</key>
        <dict>
            <key>UIWindowSceneSessionRoleApplication</key>
            <array>
                <dict>
                    <key>UISceneConfigurationName</key>
                    <string>Default Configuration</string>
                    <key>UISceneDelegateClassName</key>
                    <string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
                    <key>UISceneStoryboardFile</key>
                    <string>Home</string>
                </dict>
            </array>
        </dict>
    </dict>
于 2020-02-10T05:20:20.417 回答
0

派对有点晚了,但您可以从窗口进入 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
    }
}
于 2015-07-03T08:09:27.687 回答