iOS 学习心得记录之:拿到了ViewController就等于拿到了view

iOS 开发心得记录之:拿到了ViewController就等于拿到了view

在学习开发 iOS 的时候,我有时候会常常心里比较堵。

一个是创建了一个iOS singleView 项目之后,直接点击运行。一个什么都没有的iOS应用就跑了起来。

在这个背后,到底隐藏了哪些大致的细节?

在启动一个啥设置都没有改的iOS应用的时候,我们根据配置知道了当前的 view是main.storyboard。 mian.storyboard 后面操作着的控制器是 ViewController。

当前视图的控制器
默认配置启动的视图

默认不修改任何配置的情况下,xcode 会根据配置信息 info.plist 来启动视图的类型,并间接的找到视图的控制器,从而创建视图和视图控制器这一对好基友。

程序首次启动指定了main为第一个视图

如果我不想使用程序的默认配置,不想把viewcontroller作为默认控制器,也不想把main.storyboard作为默认视图,我要全部自己手动来写。该如何做呢?

是先删除控制器,还是先删除视图?

是视图绑定了控制器?还是控制绑定了视图?

如果是单向依赖绑定的,是删除控制器还是删除视图?

在ViewController代码里,没有看到任何和视图有关的指向或依赖关系(除了一个从UIView继承过来的一个view属性)。

但是在main.storyboard的source code 模式下,我们发现了一个配置信息表明了是main.storyboard主动和ViewController绑定的。

main.storyboard主动绑定了ViewController

在此过程中,ViewController 压根就不知道 main.storyboard的存在。在程序启动的时候,可能是根据配置信息。main.storyboard 或主动或被动的被赋值到了ViewController 的 view 属性上。

现在,我不想使用main.storyboard 作为iOS默认的启动视图,也不想使用ViewController 作为默认的视图控制器。

于是修改了程序配置,把默认启动视图设置为空,把默认的 ViewController 控制器类文件删除。

配置信息里的启动视图也没了
删除了main.storyboard 和 ViewController

现在添加自己的ViewController。

添加自己的ViewController

现在ViewController有了,view视图怎么办?之前是使用的 main.storyboard 。是一个文件。现在没有了这个文件,是不是要接着继续在添加一个my.storyboard,并设置为启动视图,并把它的ViewController设置成当前的MyViewController ?

这样做当然是可以的,但是和程序一开始启动没有做任何配置的时候就没有区别了。

既然 MyController 里有一个从 UIView 继承来的 view,我们就用这个属性来设定我们的视图,看行不行。

由于没有配置系统默认启动的页面,也就是第一次启动的页面。所以我们需要找一个合适的位置,也就是恰当的时机里,来设定我们的程序启动首视图。

在上一篇文章里,AppDelegate 就是为整个iOS程序生命周期关键时刻提供事件响应函数实现的对象。所以,很自然的,就找到了这个类的.m文件里。

AppDelegate.m文件

didFinishLaunchingWithOptions:在程序使用配置信息启动完成之后,这应该就是一个很合适的位置。

代码如下:

didFinishLaunchingWithOptions内部代码

图中标有代码标记,会根据标记一行行的说明并提出问题。

1、标记为1的代码。
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

看了很多视频和一些书籍,也没有说出个所以然来。

下面说说我个人的理解:

假设问题:在默认情况下,我们没有修改任何 iOS singleview 项目模板的配置信息。那么是否在默认的情况下,UIApplication 会默认帮助我们创建一个和当前屏幕一样大的 UIWindow 对象呢?

回答:应该是的。应为默认的 iOS 项目可以正常启动,但如果自定义自己的修改了默认设定,启用自己的 ViewController ,不写这句代码就会出现程序报错。

结论:所有的 iOS 程序都要有一个 UIWindow 主容器,不管是生命周期哪个时机创建,也不管是系统自身根据默认配置还是自己手动创建。但一定要有一个。

2、标记为2的代码

MyViewController *myController = [[MyViewController alloc] init];

很简单的一句初始化自定义控制器的代码。但它的目的是什么?

3、标记为3的代码

self.window.rootViewController = myController;

将当前window的根控制器设置成myController?rootViewController ? 那是不是还有普通的viewController 呢 ?

查看源代码,发现rootViewController 是 UIWindow 继承自 UIView 得到的。UIView 是一个视图 ,视图需要控制器。所以这个属性就代表了 UIWindow 的控制器就是我们自定义的控制器?

如果 window 就是 mycontroller 的操控的那个视图的吗? 通过测试发现并不是。

两者的地址数据并不相等

既然 myController 的 view 不是操控 window 的,那么 window 拿到 myController 的目的是什么呢?

下面全是个人猜测:

  • window 作为一个全局的容器控件,掌管着iOS运行过程中的所有UIView。
  • window 掌管视图的方式不是直接拿到视图,而是通过 myController 间接的方式控制到了视图。
  • 设置 window 的 rootViewController 属性可以通过 controller 间接的决定哪一个视图会最先的出现在iOS程序的启动屏幕上。
window & controller & view 之间的层级关系

所以,现在猜测,window 只是为了拿到首选 ViewController 从而决定了首选的 view 是哪个。(因为 controller 和 view 存在一个强绑定关系)

现在又抛出了一个问题:MyViewController 的 view 是谁 ?

先暂时放下这个问题,回到 MyViewController 的 .m 文件里。

myViewController.m 文件代码

发现,即使我们没有手动的

self.view = [[UIView alloc] init];

MyViewController 的 view 也是存在的。

所以来一个不负责任的猜测:所有的 UIViewController 在实例化的时候,会自己自动的创建一个 UIView 对象。

如果猜测没错,那么给 view 设置一个背景色应该也没啥问题吧?

给没有 alloc init 的 view 设置背景色

view 没有 alloc init 却正确的配置上了颜色。

于是不负责任的得出了一个自己浅薄的学习心得:
在做iOS开发的时候,有了 ViewController 就自动有了对应的 view 。
把更多的精力专注在 controller 上,而不要在像以前那样纠结,view 是哪个。

拿到的 controller 就行了,view 就帮我们自动创建。

开始证明【只要拿到了controller就行,view 会自动帮我们创建】

创建一个新的 OtherViewController。

创建 controller 并设置 backgroundColor

在主界面添加一个按钮跳转到这个otherController。

跳转前的 view
跳转后的 otherController view

“第一个 view 可能是因为在 iOS启动的初始阶段,iOS 启动框架有可能帮我们实例化了一个 view ,而其他的普通启动启动的 view 则需要我们自己创建 view 实例的推论就不言自破了。”

拿到了 controller 就行了,view 的创建会有 iOS 框架帮我们创建。

ps:上述全是本人在自学过程中的心得体会,可能有错误的地方,只作为同样在学习中的朋友一起探讨学习。不作为参考资料。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • 20171018工作室煮火锅 大学的工作室是一个功能齐全的屋子,很多都有洗衣、做饭,甚至睡觉的功能。霓虹国更是如此...
    采月光的人阅读 224评论 0 0
  • 酉时已过、静静的夜晚、夜晚是孤独侵蚀心房深处最毒的毒药、而我并没感到夜的孤独、反而喜欢上了它的安静、期盼着夜幕的降...
    陈琳琳阅读 235评论 0 0
  • 钟情简约风调 偏爱至美方勺
    尚小仙阅读 151评论 0 2
  • 我特别喜欢一些很安静的人,或者说是很从容的那种。那种静应该是一种力量。有人说一个人的忍耐有多大,那么他的力量就有多...
    止戈魏阅读 663评论 4 6