为什么xcode单视图模板不需要设置rootviewcontroller?

时间:2017-06-30 02:02:59

标签: ios objective-c uiwindow

据我所知,如果我们想要显示 UIWindow ,我们需要执行以下步骤:

  
      
  1. 创建UIWindow
  2.   
  3. 加载mian.storyboard并实例化视图控制器
  4.   
  5. 将控制器设置为UIWindow的根视图控制器,然后使UIWindow显示
  6.   

,如下所示:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //创建窗口对象
    self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    //创建窗口的根控制器,并且赋值
    UIViewController *rootVc = [[UIViewController alloc]init];
    self.window.rootViewController = rootVc;
    //显示窗口
    [self.window makeKeyAndVisible];
    return YES;
}

或带故事板的初始化

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {


    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];


    UIStoryboard *stroyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];


    UIViewController *vc = [stroyboard instantiateInitialViewController];

    self.window.rootViewController = vc;

    [self.window makeKeyAndVisible];

    return YES;
}

但是在模板中,我看不到那些代码,有什么我忽略的吗?

3 个答案:

答案 0 :(得分:1)

当您选择单一视图模板时,会在场景后面自动发生一些事情。

  • 在您的IB中,View Controller用户界面会检查 是初始视图控制器 属性。这意味着此View Controller是根视图控制器。initial view controller

  • 然后您在上图中看到您的视图控制器获得了Object ID 。此ID与initialViewController的{​​{1}}文件的.xml属性相匹配。如果右键单击故事板文件并选择源代码,您将看到如下内容:

    storyboard

基本上就是这样,模板会挂钩你之前需要从代码中编写的设置。现在你不必。这些都发生在单视图模板的场景之后。

答案 1 :(得分:0)

这是非常古老的代码。 Xcode有不同的流程来加载初始窗口。您不再需要该代码,如果您想知道,您可以通过检查plist来了解它是如何开始加载的。在plist里面有一个名为" Main Storyboard文件基本名称的属性" aka"" UIMainStoryboardFile",如果设置了这个,那么它将在那里加载。

供参考,这是您以编程方式显示自己的初始视图控制器(忽略IB)的方法

Programmatically set the initial view controller using Storyboards

答案 2 :(得分:0)

执行此流程:选择YourProject - > TARGETS - > General - > Deployment Info - > Main Interface,有一个选择textfiled。

如果您选择了Storyboard.storyboard,那么StoryBoard会自动执行初始化。在项目中选择Storyboard.storyboard,Open As - > Source Code可以在故事板中看到此代码段XML代码:

    <objects>
        <viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="" sceneMemberID="viewController">
            <layoutGuides>
                <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
                <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
            </layoutGuides>
            <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
                <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
            </view>
        </viewController>
        <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
    </objects>

Xcode只是使用该XML配置进行自动初始化。

如果您清除选择文本字段,Xcode将不会自动初始化窗口和ViewController,那么您应该手动使用该代码初始化UIWindow。