Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Xcode如何加载主情节提要?_Ios_Objective C_Xcode - Fatal编程技术网

Ios Xcode如何加载主情节提要?

Ios Xcode如何加载主情节提要?,ios,objective-c,xcode,Ios,Objective C,Xcode,当我使用storyboard在Xcode 4.6中创建一个新的单视图应用程序时,我们可以看到主函数使用应用程序委托创建了一个新的应用程序,如下所示: return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class])); 但是,如果我们查看MyAppDelegate.h和MyAppDelegate.m,代码中没有引用MainStoryboard.storyboard的地方。这与非故事板版本不同,在

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

return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));
但是,如果我们查看MyAppDelegate.h和MyAppDelegate.m,代码中没有引用MainStoryboard.storyboard的地方。这与非故事板版本不同,在非故事板版本中,我们可以找到以编程方式加载nib文件的代码行


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

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

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

查看项目的目标设置

请注意主情节提要设置

如果您想自己在代码中完成这项工作,您可以执行以下操作

- (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/故事板文件的方式。

如果您想使用Swift进行实例化

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

派对有点晚,但您可以从如下所示的窗口访问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
    }
}

在Xcode中,确定主情节提要的可读Info.plist部分是:

主情节提要文件基本名称

在纯文本中,键为
UIMainStoryboardFile

<key>UIMainStoryboardFile</key>
<string>Main</string>
UIMainStoryboardFile
主要

在Xcode 11.3.1中,仅更改主情节提要文件基名称是不够的,在应用程序场景清单中有一个情节提要名称配置也应该更改

    <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>
UIApplicationSceneManifest
UIApplicationSupportsMultipleScenes
UISCeneConfiguration
UIWindowsCensessionRole应用程序
UISCeneConfiguration名称
默认配置
UISCenedLegateClassName
$(产品\u模块\u名称).SceneDelegate
UISCenestryBoardFile
家

如果要在
AppDelegate
中的
ApplicationIDFinishLoading
方法中初始化情节提要,还必须创建
窗口
对象。例如,像这样
window=UIWindow(frame:UIScreen.mainScreen().bounds)
您应该使用let而不是var并使用?而不是(即使您确定),也没有真正的惩罚,您需要添加
self.window=[[UIWindow alloc]initWithFrame:UIScreen.mainScreen.bounds]
before
self.window.rootViewController=vc从iOS开发中断后,我完全错过了UIScene的东西。这个评论帮助我恢复了理智的单元测试。