1.概念问题:
一.什么是UIApplication?PPT演示
注意:UIApplication不能手动创建,不能alloc init,一个应用程序只允许
一个。
为什么要弄成单例,UIApplication对象是用来设置应用全局信息的,一个
应用程序如果有很多UIApplication对象,都不知道听谁的。
验证:单例和不能alloc,init
2.UIApplication的作用:做应用级别的操作
2.1>设置应用图标右上角的数字,图标需要手动清除,应用程序关闭,不
会自动清除.
applicationIconBadgeNumber
2.2>显示联网状态,告诉用户此应用正在联网networkActivityIndicatorVisible
2.3>打开一个资源3.URL:一个资源的唯一路径
3.1>网络资源URL的组成==协议头://主机域名/路径http://www.baidu.com/abc/1.png
3.2>本地资源URL的组成==协议头:///路径 本机域名可以不写file:///User/apple/Desktop/1.png
4.UIApplication打开资源的好处:不用判断用什么软件打开,系统会自动根据协议头判断。
5.UIApplication管理状态栏.PPT演示
5.1> ios7默认交给控制器,需要配置下,不交给控制器管理,就会交个UIApplication管理。
5.2>动画隐藏状态栏
5.3>动画设置状态栏样式
二、UIApplication的Delegate
1.AppDelegate的作用:
•为什么要搞个AppDelegate,代理设计模式,有些事情自己不想处理,交
给别人处理
•怎么成为UIApplication的代理,遵守协议。
2.在哪设置UIApplication的代理,需要了解ios程序的启动过程.
2.1>创建application,创建并且设置application的代理
2.2>开启事件循环,不断监听事件。如果产生系统事件,就会通知代
理,其他事件,会找到一个最合适的视图处理事件。2.3>只有应用程序关闭,才会结束程序
3.UIApplicationMain函数:PPT演示
•注意UIApplicationMain函数会开启一个事件循环,并不会马上就执行完
毕。
•底层做的事情,创建UIApplication对象和UIApplicationDelegate对象,设置
UIApplication的代理,开启事件循环,监听系统事件。
3.1>delegateClassName不能传nil,这里传nil,意味着application没有代理,就无法监听系统的事件,系统的事件都没法监听,窗口都不知道什么时候去加载,因为视图都是懒加载的,因此就不会创建窗口,什么东西都没有。
3.2>principalClassName传nil,默认是UIApplication,创建一个
UIApplication对象。
4.UIApplication代理的作用:处理系统事件,不是任何事件都交给他处理,按
钮点击,屏幕点击都不是他处理,是由UIApplication处理。
2.1>加载完成,初始化的操作
2.2>进入后台:一般在这里保存应用的数据(游戏数据,比如暂停游戏)
2.3>内存警告:清空不必要的内容
三、window:通常一个app只会有一个UIWindow对象,但是可以创建多个,而iOS程序之所以能显示到屏幕上就是因为UIWindow,即:IOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view最后将控制器的view添加到了UIWindow上,于是控制器的view就显示在了屏幕上,自己创建窗口,窗口显示出来,两个条件。1.makeKeyAndVisible2.窗口不要被释放
注意:
1>keyWindow:makeKeyAndVisible会让窗口成为主窗口,并且显示出来,打印applic
2>创建的窗口交给windows这个数组管理: ?
○在创建一个窗口显示出来,一个应用程序只有一个主窗口,并且显示出来的窗口,application管理,application有个Windows数组,存放显示出来的窗口,有一个例外
态栏也是一个窗口,但是没有交给application管理。打印application.windows
3>还有那些是窗口?键盘也是窗口,创建一个textField成为第一响应者,并且加到最里
显示在最前面,打印application.windows,就知道了。
4>为什么他们会显示在最前面,因为窗口有层级,他们的层级高
5> windowLevel:UIWindowLevelNormal < UIWindowLevelStatusBar < UIWindowLevelAlert
UIWindowLevelNormal :默认窗口的层级UIWindowLevelStatusBar :状态栏,键盘、UIWindowLevelAlert:UIActionSheet,UIAlearView
6>把window的层级设置为UIWindowLevelAlert,就会显示在最前面。
四.UITableView和UIButton的层级结构(继承关系),一直到 NSObject .
(1)UITableView -> UIScrollView -> UIView -> UIResponder -> NSObject
(2)UIButton -> UIControl -> UIView -> UIResponder -> NSObject
五.关于响应者对象:
概念:在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件。这种有响应和处理事件的对象,我们称之为“响应者对象”。UIApplication、UIViewController、UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件
响应者链的事件传递过程:(1)如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图(2)在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理(3)如果window对象也不处理,则其将事件或消息传递给UIApplication对象(4)如果UIApplication也不能处理该事件或消息,则将其丢弃
六、关于view的几个模糊点:
1、控制器的view的创建的决定权:重写loadView>storyboard>nibName>xib;
注意:loadView的使用方法
1> loadView作用:一般用来创建自定义的view
2> loadView什么时候调用:当控制器的view没有创建的时候,就会调用loadView去创建控制器的view.
3> loadView使用注意:如果重写loadView里面没有创建控制器的view,就不能使
用self.view,会造成死循环。
2.控制器的view是透明的:直接通过alloc,init创建的控制器的view默认是透明的
七、关于storyboard控制器的创建:
怎么自己通过storyboard创建控制器(空项目),之前都是系统加载storyboard,帮我们创建好控制器。
•了解UIStoryboard对象,通过这个对象,就能加载storyboard文件
注意:必须要有storyboard,创建UIStoryboard对象才有意义,alloc init创
建UIStoryboard对象没有意义
1.1>instantiateInitialViewController:默认加载箭头指向的控制器
1.2>instantiateViewControllerWithIdentifier:根据标识在storyboard查找
控制器,并且创建。
○标识不能乱传,会报错的,必须storyboard有这个标识才行。
1.3>现在创建的控制器都不能处理事件,如果需要处理事件,需要自定
义控制器。
现在创建的控制器为什么不能处理事件?
原因:当通过storyboardID找到storyboard中的控制器的时候,就会
创建storyboard中描述的控制器对象,创建对象首先得知道类名,
会根据storyboard中的Custom Class确定类名,然后创建对象,默认
都是系统自带的对控制器对象,系统自带的是不能处理事件的。他
不能写监听方法。
八、关于控制器的生命周期方法:
1>演示导航控制器根控制器View的生命周期(viewDidLoad这些view开头
的,称为生命周期方法)
•通过view的生命周期方法,就知道控制器的view是懒加载的,导航
控制器有2个子控制器,先会加载第一个子控制器的view,当Push
第二个的时候,才去加载第二个控制器的view
2>didReceiveMemoryWarning,当控制器接收内存警告的时候调用3>内存警告传递过程:手机内存不足产生事件->通知应用程序->调用应用程序代理方法->把事件传递给窗口->窗口传给控制器->调用控制器内存警告的方法。4>当控制器接收内容警告,会销毁没有显示的控制器的view。5>调用viewWillUnload,viewDidUnload,销毁控制器的view
6>viewDidUnload里面一般清空显示在view里面的数据,演示非arc开发
•为什么要清空显示view的数据:展示数据的view都不存在了,这些
数据也就没有用处了,因为数据主要是用来展示在view上的。
setDatas:(NSArray*)datas;
•建议使用nil,清空数据,在非arc和arc都通用。arc是不能使用release,而且非arc,self.datas = nil;做的事情更多。
7>didReceiveMemoryWarning会导致viewDidLoad重新调用。
○当收到内存警告,导航控制器的子控制器的view有可能被干掉,他
如果没有显示的话,当下次使用这个控制器的时候就会调用。
具体而言:
- (void)init; // 创建
- (void)loadView; // 构建视图层级结构
- (void)viewDidLoad; // 视图完成加载
- (void)viewWillAppear:(BOOL)animated; // 视图将要出现在屏幕上
- (void)viewWillLayoutSubviews; // 视图将要布局子视图,用代码调整控件布局才会使用
- (void)viewDidLayoutSubviews; // 视图布局子视图完成
- (void)viewDidAppear:(BOOL)animated; // 视图完成显示,视图已经出现在屏幕上
- (void)viewWillDisappear:(BOOL)animated; // 视图将要从屏幕上消失
- (void)viewDidDisappear:(BOOL)animated; // 视图已经从屏幕上消失
- (void)dealloc; // 释放视图控制器
九、导航控制器的使用
3.0>学一个新的控制器,先学他内部的结构和他的作用
• UINavgationViewController的内部结构(导航条,导航控制器的
view,存放导航控制器子控制器的view)
3.1>怎么添加导航控制器的子控制器,push,或者一创建的时候就给一个根控制器,默认第一个子控制器叫根控制器。
3.2>怎么管理很多子控制器?push很多控制器就OK了,不要一下子push很多子控制器,跳转控制器的权利应该交给用户,由用户决定进入那个界面。
3.3>通常开发中是给某个控制器添加导航功能,是点击某个控制器中的
控件,导航到另外一个控制器
•因此一开始只需要显示导航控制器的根控制器就好,具体需不需要
导航,由用户决定,如果需要导航,就点击跟控制器的按钮。
•导航控制器的作用:用来做导航功能,一个控制器如果想拥有导航
功能,就包装成导航控制器。
4> UINavgationViewController子控制器管理原理
4.1>导航控制器是通过栈管理子控制器,PPT分析,栈是先进后出4.2> push把控制器压入栈,然后创建控制器的view,把控制器的view在添加到导航控制器上
4.3>什么是栈顶和栈底控制器,栈底也叫导航控制器的根控制器。
4.4>显示到导航控制器的永远是栈顶控制器的view,栈底控制器的view不会被销毁,只是移除父视图。4.5>点击返回,移除栈顶控制器,移除的控制器会被销毁
5.导航控制器出栈操作
•首先了解topViewController和viewControllers和childViewControllers,出栈
的时候可能用到。
5.0. topViewController获取栈顶控制器。
5.1 viewControllers和childViewControllers:压入栈的控制器都会作为导航控制器的子控制器。
5.2通过pop手动出栈,之前都是点击back自动出栈。
5.3主动出栈,要求出栈的控制器必须是栈里面的控制器,不能自己创建
一个控制器出栈,会报出栈的控制器不存在的错误,这时候可以用
viewControllers或者childViewControllers拿到根控制器。
5.4 pop控制器,不会马上销毁栈顶控制器,而是告诉导航控制器需要把
栈顶控制器出栈,等到恰当的时间就会把栈顶控制器出栈,并且销
5.2通过pop手动出栈,之前都是点击back自动出栈。
5.3主动出栈,要求出栈的控制器必须是栈里面的控制器,不能自己创建
一个控制器出栈,会报出栈的控制器不存在的错误,这时候可以用
viewControllers或者childViewControllers拿到根控制器。
5.4 pop控制器,不会马上销毁栈顶控制器,而是告诉导航控制器需要把
栈顶控制器出栈,等到恰当的时间就会把栈顶控制器出栈,并且销
毁。(断点演示)
6.设置导航条的内容
6.1>一个导航控制器只有一个导航条,子控制器共用一个导航条。
6.2>如何设置导航条的内容,导航条的内容由栈顶控制器的navigationItem决定,因此导航控制器必须要有一个根控制器,本身不具备完整的显示功能,因为他的导航条他自己不能决定。
6.3>设置one控制器的导航条标题,显示one的时候,one就是栈顶控制
器,直接拿到navigationItem设置title.或者self.title
6.4设置navigationItem的titleView为UISegmentedControl,不需要设置位置,只需要设置尺寸。
6.5设置导航条左右两边按钮,按钮必须是
UIBarButtonItem.leftBarButtonItem,rightBarButtonItem,rightBarButtonItems
6.6导航条上的返回按钮由上一个控制器决定。
1>如果上一个控制器没有设置标题,默认back
2>如果上一个控制器设置标题,并且没有超过12个字符,默认返
回标题和上一个控制器一致,如果超过12个字符,就会变成back。
3>还可以主动直接设置下一个界面的返回按钮,设置上一个控制
器的backBarButtonItem属性
7.验证导航条的frame和导航控制器的内部结构,用一个UIView的分类。
1>导航条的的高度是44
2>利用UIView的分类,生成导航控制器view的内部结构的xml,写入桌面。
3> ios6和ios7导航控制器的区别。
8.导航控制器-利用storyboard创建
8.1>程序一启动,就加载导航控制器,设置storyboard箭头指向导航控制器
8.2>设置导航控制器的根控制器为UIViewController
8.3>设置导航条的内容,还有下一个控制器的返回按钮
8.4>利用storyboard做跳转,选中按钮拖线
8.5>利用按钮,回到上一个控制器,不能回拖,会新创建一个控制器,
只能通过代码。
UIView的常见属性:
1. 头UIView的设定
frame由系统决定- (UIView*) tableView …..viewforHeader…
2. 更改按钮中内部控件的位置
//关键:想更改内部控件的位置,先更改按钮水平方向上显示的方式
self.btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
3. 不能响应交互的几种情况
3.1 alpha < 0.01的时候,就不可以被点击了
3.2 hidden属性 为YES
3.3 自身的 userInterAction被设置为了NO
3.4 父控件的userInterAction 设置为了NO
一个控件的事件响应,通常是先有它父控件获取到,如果子控件响应了,就结束,未响应就会传递给它的父控件
3.5 子控件超出父控件的部分,不可被点击
4. 图片变形问题
//变形self.btn.imageView.contentMode = UIViewContentModeCenter;
//取消系统默认截取子控件的功能self.btn.imageView.clipsToBounds = NO;
UIImageView.contentMode属性->拉伸方式分两种
UIViewContentModeScaleAspectFit, 只有有一个条件满足就不拉伸了
UIViewContentModeScaleAspectFill, 必须两个条件都满足