簡體   English   中英

Xcode 如何加載主故事板?

[英]How does Xcode load the main storyboard?

當我使用 storyboard 在 Xcode 4.6 中創建一個新的單視圖應用程序時,我們可以看到 main 函數使用應用程序委托創建了一個新應用程序,如下所示:

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

然而,如果我們查看 MyAppDelegate.h 和 MyAppDelegate.m,代碼中沒有任何地方引用 MainStoryboard.storyboard。 這與非故事板版本不同,在非故事板版本中,我們可以找到以編程方式加載 nib 文件的代碼行。

所以我的問題是,故事板是如何加載的? (我應該戳哪里才能找到它?)

查看項目的目標設置

在此處輸入圖片說明

注意主故事板設置。

如果你想自己在代碼中做到這一點,你會做類似的事情。

- (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 文件通過包含 NSMainNibFile 鍵和值的有效 nib 文件名指定要加載的主 nib 文件,則此函數加載該 nib 文件。

UIApplicationMain被調用時,會加載一個包含所有應用程序信息的 plist 文件:

在此處輸入圖片說明

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

它從 info.plist 文件的 UIMainStoryboardFile 設置開始。 然后 Xcode 創建一個主窗口,實例化您的第一個視圖控制器,並將其添加到窗口中。 您仍然可以在類似於 .nib 的代碼中使用

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController* initialView = [storyboard instantiateInitialViewController];

在 Xcode 中,確定主故事板的人類可讀的 Info.plist 部分是:

Main storyboard file base name

在純文本中,關鍵是UIMainStoryboardFile

<key>UIMainStoryboardFile</key>
<string>Main</string>

如果你想用 Swift 實例化

var storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
var vc : AnyObject! = storyboard.instantiateInitialViewController()
self.window!.rootViewController = vc as UIViewController
self.window!.makeKeyAndVisible()

在 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>

聚會有點晚,但您可以從窗口進入 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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM