【原】iOS学习之控制器的创建
本次博客是一篇总结性质的博客,总结的是各种创建控制器的方式以及一些需要注意的操作。
1、通过storyboard创建控制器
正如我上一篇博客中所说,当 Main Interface 没有选定的时候,我们一般只能通过代码来创建一个 UIWindow,不再使用系统创建好的 Main.storyboard。
通过 storyboard 创建控制器也是在 Main Interface 没有选定的时候,但是我们还使用系统创建好的 Main.storyboard,通过不同的方法来创建窗口的根控制器。
- 第一步:在 AppDelegate.m 文件的 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中先初始化一个 UIWindow 对象,代码如下:
// 创建窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
- 第二步:创建一个 UIStoryboard 对象并将其初始化为 Main.storyboard
初始化方法:
// 参数1:storyboard文件名,不需要带后缀
// 参数2:置为nil时表示[NSBundle mainBundle]
+ (UIStoryboard *)storyboardWithName:(NSString *)name bundle:(nullable NSBundle *)storyboardBundleOrNil;
实例代码:
// 加载storyboard
// storyboard文件名,不需要带后缀,初始化为 Main.storyboard,name就是Main
// nil: [NSBundle mainBundle]
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
- 第三步:通过storyboard创建控制器
① 指定箭头指向的控制器为窗口的根控制器
方法:
// 加载箭头指向的控制器
- (nullable __kindof UIViewController *)instantiateInitialViewController;
实例代码:
// 通过storyboard创建控制器
// instantiateInitialViewController:加载箭头指向的控制器
UIViewController *vc = [storyboard instantiateInitialViewController];
实例图:
如上图:我们将粉色背景的控制器设置为默认 Main.storyboard 的控制器,当我们使用上述代码时,程序运行的效果是:如下图的一个粉色窗口
② 通过 Storyboard ID 来创建根控制器
方法:
// 参数为:Storyboard ID 的字符串
- (__kindof UIViewController *)instantiateViewControllerWithIdentifier:(NSString *)identifier;
实例代码:
// 通过 Storyboard ID 创建控制器
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创建根控制器的方法是一个控制器的初始化方法,实例代码:
// 通过xib创建控制器
ViewController *vc = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
加载xib的特殊写法:
// 特殊写法1:
UIViewController *vc = [[ViewController alloc] initWithNibName:nil bundle:nil];
// 特殊写法2:
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学习之控制器的创建的更多相关文章
- 【转】 iOS学习之sqlite的创建数据库,表,插入查看数据
原文: http://blog.csdn.net/totogo2010/article/details/7702207 iOS sqlite数据库操作.步骤是: 先加入sqlite开发库libsql ...
- iOS学习之sqlite的创建数据库,表,插入查看数据
目录(?)[-] 新建项目sqliteDemo添加使用sqlite的库libsqlite3dylib sqlite 的方法 获取沙盒目录并创建或打开数据库 创建数据表 插入数据 查询数据库并打印数据 ...
- iOS学习笔记: 使用CAShapeLayer创建带有空心区域的遮罩层
CAShapeLayer是用来接受矢量Path,直接使用GPU来进行渲染的特殊图层.看下面效果: 对应代码: let markLayer = CAShapeLayer(); markLayer.fra ...
- 【原】iOS学习之事件处理的原理
在iOS学习23之事件处理中,小编详细的介绍了事件处理,在这里小编叙述一下它的相关原理 1.UITouch对象 在触摸事件的处理方法中都会有一个存放着UITouch对象的集合,这个参数有什么用呢? ( ...
- 【原】iOS学习47之第三方-FMDB
将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...
- [转]iOS学习笔记(2)--Xcode6.1创建仅xib文件无storyboard的hello world应用
转载地址:http://www.mamicode.com/info-detail-514151.html 由于Xcode6之后,默认创建storyboard而非xib文件,而作为初学,了解xib的加载 ...
- iOS学习笔记(2)--Xcode6.1创建仅xib文件无storyboard的hello world应用
http://www.mamicode.com/info-detail-514151.html 由于Xcode6之后,默认创建storyboard而非xib文件,而作为初学,了解xib的加载原理很重要 ...
- 【原】iOS学习之SQLite和CoreData数据库的比较
1. SQLite数据库 sqlite数据库操作的基本流程是, 创建数据库, 再通过定义一些字段来定义表格结构, 可以利用sql语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系. ...
- iOS开发UI篇—控制器的创建
iOS开发UI篇—控制器的创建 说明:控制器有三种创建方式,下面一一进行说明. 一.第一种创建方式(使用代码直接创建) 1.创建一个空的IOS项目. 2.为项目添加一个控制器类. 3.直接在代理方法中 ...
随机推荐
- 如何学好JAVA编程
我的思路: 1.我觉得先学学JSP,用纯JSP做个日记本简单的小系统,纯粹从语言层面上了解一些基 础知识,把tomcat玩熟了,就用记事本编就行,主要是熟悉,能够理解jsp运行机制.然 ...
- C++ 11 中的右值引用
C++ 11 中的右值引用 右值引用的功能 首先,我并不介绍什么是右值引用,而是以一个例子里来介绍一下右值引用的功能: #include <iostream> #include &l ...
- session生命周期(一)
Session存储在服务器端,一般为了防止在服务器的内存中(为了高速存取),Session在用户访问第一次访问服务器时创建,需要注意只有访问JSP.Servlet等程序时才会创建Session,只访问 ...
- 【JWT】JWT+HA256加密 Token验证
目录 Token验证 传统的Token验证 JWT+HA256验证 回到顶部 Token验证 最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twi ...
- html页面的CSS、DIV命名规则
CSS命名规则 头:header 内容:content/containe 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wrapper 左右中:l ...
- jQuery如何判断元素是否是隐藏的?
jQuery函数简介: is(expr) 用一个表达式来检查当前选择的元素集合,如果其中至少有一个元素符合这个给定的表达式就返回true. 如果没有元素符合,或者表达式无效,都返回'false'. 注 ...
- 用vuejs实现一个todolist项目
用vue.js实现一个todolist项目:input输入框输入的值会呈现在下方,并且会保存在localStorage里面,而且下方的列表点击之后也会有变化: 完整代码: App.vue <te ...
- Dynamic range compression
这段时间终于把手头的东西都搞完了,还剩下一个AEC这个模块,这个模块跟整个系统机制有很大关系,单独的模块意义不大. 另外,刚写完一个分类器,希望能大幅提升音乐流派分类的准确率. 下周正式开搞AEC,把 ...
- Excel 相对引用与绝对引用
相对引用与绝对引用 相对引用与绝对引用的区别在于,当将公式复制到其它单元格时,公式中单元格或单元格区域的地址是否有变化. 相对引用在复制公式时地址跟着发生变化,而绝对引用不会发生变化!绝对引用的方 ...
- laravel安装笔记
一.安装composer 安装之前将\php\php.ini文件中的php_openssl.dll扩展库开启,否则composer在安装过程中会出现错误提示. (我在安装过程中发现apache目录下的 ...