本次博客是一篇总结性质的博客,总结的是各种创建控制器的方式以及一些需要注意的操作。

1、通过storyboard创建控制器

 正如我上一篇博客中所说,当 Main Interface 没有选定的时候,我们一般只能通过代码来创建一个 UIWindow,不再使用系统创建好的 Main.storyboard。

 通过 storyboard 创建控制器也是在 Main Interface 没有选定的时候,但是我们还使用系统创建好的 Main.storyboard,通过不同的方法来创建窗口的根控制器。

  • 第一步:在 AppDelegate.m 文件的 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中先初始化一个 UIWindow 对象,代码如下:
  1. // 创建窗口
  2. self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  • 第二步:创建一个 UIStoryboard 对象并将其初始化为 Main.storyboard

  初始化方法:

  1. // 参数1:storyboard文件名,不需要带后缀
  2. // 参数2:置为nil时表示[NSBundle mainBundle]
  3. + (UIStoryboard *)storyboardWithName:(NSString *)name bundle:(nullable NSBundle *)storyboardBundleOrNil;

  实例代码:

  1. // 加载storyboard
  2. // storyboard文件名,不需要带后缀,初始化为 Main.storyboard,name就是Main
  3. // nil: [NSBundle mainBundle]
  4. UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
  • 第三步:通过storyboard创建控制器

  ① 指定箭头指向的控制器为窗口的根控制器

  方法:

  1. // 加载箭头指向的控制器
  2. - (nullable __kindof UIViewController *)instantiateInitialViewController;

  实例代码:

  1. // 通过storyboard创建控制器
  2. // instantiateInitialViewController:加载箭头指向的控制器
  3. UIViewController *vc = [storyboard instantiateInitialViewController];

  实例图:

  如上图:我们将粉色背景的控制器设置为默认 Main.storyboard 的控制器,当我们使用上述代码时,程序运行的效果是:如下图的一个粉色窗口

  ② 通过 Storyboard ID 来创建根控制器

  方法:

  1. // 参数为:Storyboard ID 的字符串
  2. - (__kindof UIViewController *)instantiateViewControllerWithIdentifier:(NSString *)identifier;

  实例代码:

  1. // 通过 Storyboard ID 创建控制器
  2. UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"green"];

  正如 ① 中所示的图,我们将绿色背景的控制器的 Storyboard ID 置为 "green",但是Main.storyboard 的默认控制器仍然为粉色背景的控制器,使用上述实例代码,运行结果为如下图的一个绿色窗口

  具体如何设置视图控制器为 UIWindow 对象的根视图控制器以及将 UIWindow 对象作为主窗口并可见,请参考上一篇博客。

2、通过xib创建控制器

 通过 xib 创建控制器也是在 Main Interface 没有选定的时候,自己在 AppDelegate.m 文件中对应的方法中先初始化一个 UIWindow 对象。

 创建xib的方法:

  ① 在创建一个视图控制器的类的时候,将 Also create XIB file 选中之后,就会创建出来一个和控制器类对应的xib,如下图:

    这种方法创建的xib的名字与所对应的类名相同。

  ② 创建一个名字可以自定义的 xib

  创建后的设置:(具体如下图)

   (1)选择文件所有者选项

   (2)绑定控制器

   (3)绑定xib视图

  通过xib创建根控制器的方法是一个控制器的初始化方法,实例代码:

  1. // 通过xib创建控制器
  2. ViewController *vc = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];

  加载xib的特殊写法:

  1. // 特殊写法1:
  2. UIViewController *vc = [[ViewController alloc] initWithNibName:nil bundle:nil];
  3. // 特殊写法2:
  4. UIViewController *vc = [[ViewController alloc] init];

  以上 xib 的特殊写法加载 xib View 视图的底层实现:

   如果描述控制器 View 的 xib 跟控制器的类名相同,就会去加载

   只有控制器的 init 方法底层会调用 initWithNibName:bundle:

   只要通过 initWithNibName:bundle: 初始化控制器,并且 nibName 为 nil ,就会执行以下几步:

   (1)先寻找有没有跟控制器类名同名但是不带Controller的xib,如果有就会去加载(XMGView.xib)

   (2)如果没有就寻找有没有跟控制器类名同名的xib,如果有就会去加载(XMGViewController.xib)

   (3)如果都没有找到,创建空的view,

【原】iOS学习之控制器的创建的更多相关文章

  1. 【转】 iOS学习之sqlite的创建数据库,表,插入查看数据

    原文:  http://blog.csdn.net/totogo2010/article/details/7702207 iOS sqlite数据库操作.步骤是: 先加入sqlite开发库libsql ...

  2. iOS学习之sqlite的创建数据库,表,插入查看数据

    目录(?)[-] 新建项目sqliteDemo添加使用sqlite的库libsqlite3dylib sqlite 的方法 获取沙盒目录并创建或打开数据库 创建数据表 插入数据 查询数据库并打印数据 ...

  3. iOS学习笔记: 使用CAShapeLayer创建带有空心区域的遮罩层

    CAShapeLayer是用来接受矢量Path,直接使用GPU来进行渲染的特殊图层.看下面效果: 对应代码: let markLayer = CAShapeLayer(); markLayer.fra ...

  4. 【原】iOS学习之事件处理的原理

    在iOS学习23之事件处理中,小编详细的介绍了事件处理,在这里小编叙述一下它的相关原理 1.UITouch对象 在触摸事件的处理方法中都会有一个存放着UITouch对象的集合,这个参数有什么用呢? ( ...

  5. 【原】iOS学习47之第三方-FMDB

    将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...

  6. [转]iOS学习笔记(2)--Xcode6.1创建仅xib文件无storyboard的hello world应用

    转载地址:http://www.mamicode.com/info-detail-514151.html 由于Xcode6之后,默认创建storyboard而非xib文件,而作为初学,了解xib的加载 ...

  7. iOS学习笔记(2)--Xcode6.1创建仅xib文件无storyboard的hello world应用

    http://www.mamicode.com/info-detail-514151.html 由于Xcode6之后,默认创建storyboard而非xib文件,而作为初学,了解xib的加载原理很重要 ...

  8. 【原】iOS学习之SQLite和CoreData数据库的比较

    1. SQLite数据库 sqlite数据库操作的基本流程是, 创建数据库, 再通过定义一些字段来定义表格结构, 可以利用sql语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系. ...

  9. iOS开发UI篇—控制器的创建

    iOS开发UI篇—控制器的创建 说明:控制器有三种创建方式,下面一一进行说明. 一.第一种创建方式(使用代码直接创建) 1.创建一个空的IOS项目. 2.为项目添加一个控制器类. 3.直接在代理方法中 ...

随机推荐

  1. 浅谈JavaScript中的defer,async

    引言 开始重读<<JavaScript高级程序设计>>一书,看到关于JavaScript中关于defer.async的部分.网上查询了点资料,觉得蛮好的.现在总结下. defe ...

  2. Linux中挂载window7的共享文件

    window7主机: 设置要共享的文件夹 Linux Fedora: 0 su su root 1 samba-client yum install samba-client 2 cifs-utils ...

  3. 二叉树的层序遍历 BFS

    二叉树的层序遍历,或者说是宽度优先便利,是经常考察的内容. 问题一:层序遍历二叉树并输出,直接输出结果即可,输出格式为一行. #include <iostream> #include &l ...

  4. 7、I/O流

    一.流的概念:流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作.I/O就 ...

  5. windows7安装GitBash和GitGui

    安装很简单,搜索安装就行. 配置: 1.$ ssh-keygen -t rsa -C "your_email@youremail.com" 将"your_email@yo ...

  6. [Python] 机器学习库资料汇总

    声明:以下内容转载自平行宇宙. Python在科学计算领域,有两个重要的扩展模块:Numpy和Scipy.其中Numpy是一个用python实现的科学计算包.包括: 一个强大的N维数组对象Array: ...

  7. Rails的三种环境----开发环境,生产环境和测试环境

    Rails 的三个环境 Rails 的应用程序预设提供了三种不同的执行模式: development environment 开发模式,用在你的开发的时候 test environment 测试模式, ...

  8. jquery选择器(总结)

    基本选择器 选择器 描述 示例 #id 根据给定的ID匹配一个元素 $("#id")   .class 根据制定的class匹配一个元素 $(".class") ...

  9. Linux服务器,PHP的10大安全配置实践

    PHP被广泛用于各种Web开发.而当服务器端脚本配置错误时会出现各种问题.现今,大部分Web服务器是基于Linux环境下运行(比如:Ubuntu,Debian等).本文例举了十大PHP最佳安全实践方式 ...

  10. PHP的继承方法如何获取子类名?get_class() 和 get_called_class()

    PHP里的__CLASS__这类东西是静态绑定的,如果不在子类里重载的话,那么继承父类方法所得到的依旧是父类的名称,而不是子类的名称,比如: <?php class A { function _ ...