CHENYILONG

  • Blog

笔记


一、iOS程序的完整启动过程(有storyboard)
1.先执行main函数,main内部会调用UIApplicationMain函数

2.UIApplicationMain函数里面做了什么事情:
1> 创建UIApplication对象

2> 创建UIApplication的delegate对象-----MJAppDelegate

3> 开启一个消息循环
* 每监听到对应的系统事件时,就会通知MJAppDelegate

4> 为应用程序创建一个UIWindow对象(继承自UIView),设置为MJAppDelegate的window属性

5> 加载Info.plist文件,读取最主要storyboard文件的名称

6> 加载最主要的storyboard文件,创建白色箭头所指的控制器对象

7> 并且设置第6步创建的控制器为UIWindow的rootViewController属性(根控制器)

8> 展示UIWindow,展示之前会将添加rootViewController的view到UIWindow上面(在这一步才会创建控制器的view)
[window addSubview: window.rootViewControler.view];

二、UIWidnow
1.常见方法
1> 成为主窗口
[window makeKeyWindow];

2> 显示、并且成为主窗口
[window makeKeyAndVisible];

3> 仅仅是显示窗口
window.hidden = NO;

2.主窗口
1> 一个iOS app只能有一个主窗口(keyWindow),只有keyWindow才能接受文本框的输入事件

2> 如何访问主窗口
* [UIApplication sharedApplication].keyWindow

3.app中所有的窗口
* [UIApplication sharedApplication].windows

4.屏幕的旋转事件
1> 当屏幕旋转,UIApplication对象接受到旋转事件,接着会通知keyWindow
2> 最终,旋转事件传递到UIWidnow身上,UIWindow会通知rootViewControler,rootViewControler自己会决定要不要做相应的旋转操作

三、UIViewController
1.控制器内部的view是延迟加载
1> 用到时再加载
2> 加载完毕后会调用控制器的viewDidLoad方法

2.创建控制器的方式
1> 直接通过代码创建
MJOneViewController *one = [[MJOneViewController alloc] init];
// 如果调用init方法创建控制器(MJTwoViewController),那么在加载控制器view的时候:
// 1.优先查找 “MJTwoView.xib"
// 2.其次再查找 同名 的xib 文件 “MJTwoViewController.xib"
// 3.如果没有找到上述的xib文件,会直接通过代码创建一个空白的view

2> 通过storyboard创建控制器
* 加载storyboard文件
UIStoryboard *story = [UIStoryboard storyboardWithName:@"sb的文件名" bundle:nil];

* 从storyboard中创建控制器
// 根据控制器在storyboard文件中storyboard id来创建
MJOneViewController *one = [story instantiateViewControllerWithIdentifier:@"控制器的storyboard id"];

// 直接创建箭头所指的控制器(initial controller)
MJOneViewController *one = [story instantiateInitialViewController];

3> 通过xib创建控制器
// 创建控制器的view时,就会加载MJOneViewController.xib文件,并且会将控制器当做是xib的Owner传入
MJOneViewController *one = [[MJOneViewController alloc] initWithNibName:@"MJOneViewController" bundle:nil];
// 加载one控制器的view:[[NSBunle mainBundle] loadNibName:@"MJOneViewController" owner:one options:nil];

// 总结:能用storyboard描述控制器的view,就尽量用storyboard

四、导航控制器
1.常见方法
1> 将子控制器vc压入栈中
[self.navigationController pushViewController:vc animated:YES];

2> 出栈(弹出栈顶控制器)
[self.navigationController popViewControllerAnimated:YES];

3> 直接跳到栈底控制器(回到根控制器)
[self.navigationController popToRootViewControllerAnimated:YES];

2.使用原理
1> 导航控制器内部有个viewControllers栈来存放所有的子控制器
2> 展示在导航控制器上面的永远是栈顶控制器的view

3.一般情况下,导航栏上面显示什么内容,由当前栈顶控制器的navigationItem属性决定
* navigationItem.title : 导航栏的中间标题(也可以直接通过控制器的title属性设置标题)
* navigationItem.titleView : 导航栏的中间控件
* navigationItem.leftBarButtonItem : 导航栏左边的按钮
* navigationItem.rightBarButtonItem : 导航栏右边的按钮

4.特殊:导航栏左上角的返回按钮 文字 由上一个控制器的navigationItem.backBarButtonItem决定
* 返回按钮不需要监听(默认的操作就是出栈)

© chenyilong. Powered by Postach.io

  • Blog

转载于:https://www.cnblogs.com/ChenYilong/p/3560217.html

iOS程序启动过程笔记相关推荐

  1. iOS程序启动原理(上)

    为什么80%的码农都做不了架构师?>>>    iOS程序启动原理 Info.plist 常见设置 建立一个工程后,会在Supporting files文件夹下看到一个"工 ...

  2. Delta3d框架学习--程序启动过程详解

    一个Delta3d程序启动过程详解 一.初始化一个dtGame::GameApplication的实例,dtGame::GameApplication* app = new dtGame::GameA ...

  3. iOS程序启动原理---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...

  4. 深入理解iOS APP启动过程

    前言 启动时间是衡量应用品质的重要指标. 本文首先会从原理上出发,讲解iOS系统是如何启动App的,然后从main函数之前和main函数之后两个角度去分析如何优化启动时间. 准备知识 Mach-O 哪 ...

  5. Framework学习(五)应用程序启动过程

    注释1处设置Flag为Intent.FLAG_ACTIVITY_NEW_TASK,这样根Activity会在新的任务栈中启动. 注释2处调用了Activity的startActivity函数. fra ...

  6. Android应用程序启动过程源代码分析(5)

    Step 35. MainActivity.onCreate 这个函数定义在packages/experimental/Activity/src/shy/luo/activity/MainActivi ...

  7. 飞鸽传书源码分析-程序启动过程

    本文章是在飞鸽传书的2.06源码基础上分析 飞鸽传书源码运行流程如下,本篇文章只说明了飞鸽传书的启动过程,对于飞鸽伟书的消息机制及菜单加载等功能都不在本篇文章范围之内. 1. WinMain函数 [c ...

  8. 【iOS程序启动与运转】- RunLoop个人小结

    作者:楚天舒 授权本站转载. 学习iOS开发一般都是从UI开始的,从只知道从IB拖控件,到知道怎么在方法里写代码,然后会显示什么样的视图,产生什么样的事件,等等.其实程序从启动开始,一直都是按照苹果封 ...

  9. SpringBoot 应用程序启动过程探秘

    本文共 946字,阅读大约需要 3分钟 ! 概述 说到接触 SpringBoot 伊始,给我第一映像最深的是有两个关键元素: 对照上面的典型代码,这个两个元素分别是: @SpringBootAppli ...

最新文章

  1. 市场有变,中小型基因测序机构机会来了
  2. [机器学习] Coursera ML笔记 - 逻辑回归(Logistic Regression)
  3. C语言试题六十一之请编写函数fun:将s所指字符串中下标为偶数的字符删除,串中剩余字符形成新串放在t所指数组中。
  4. 分羊(区间dp:分治与决策单调性优化)
  5. 教程系列——用模板快速生成《客户意见反馈表》
  6. Flutter 底部向上动画弹出的菜单选项
  7. 天善SVIP五折狂欢!今年双十一终于不用剁手了
  8. Transparent Tribe行动
  9. OPENCV中定义ROI区域以及ROI区域的相关融合(程序解读)
  10. Jupyter Notebook 内核似乎挂掉了,它很快将自动重启
  11. linux syscall 内核系统调用API接口
  12. 安装多个版本号jdk后java -version不改变的问题解决
  13. UC伯克利教授Stuart Russell人工智能基础概念与34个误区 (公号回复“AI基础概念”可下载PDF资料)
  14. Webpack--模块热替换(HMR)
  15. entity命名规则
  16. Cesium 粒子系统应用:消防车灭火模拟
  17. UIStackView Masonry
  18. android友盟分享图标是英文,GitHub - GDMiao/UmengEnclosed: 友盟分享二次封装,现有文字分享、图片分享、网页分享等多种分享功能。...
  19. 1秒变大神,学会这个PPT技巧,让你的PPT比别人好看30倍!
  20. 【Java实战项目】两小时教你做出网上订餐系统

热门文章

  1. pickle模块介绍
  2. 不同存储区域的数组分析
  3. 深入Atlas系列:客户端网络访问基础结构示例(1) - 编写并使用自定义的WebRequestExecutor...
  4. Python——反射
  5. 用流读取文件中的内容
  6. RedisDesktopManager连接不上redis的解决方法
  7. spring框架学习(一)入门
  8. 网上看的一篇文章,感觉会给程序员一些启发
  9. 2015年计算机初中,2015北京小升初电脑派位解读
  10. 构造一个日期类java_Java8 新日期时间类(1)