再开个简单且基础的坑吧,这个弄完了弄点别的了,弄的自己都觉得没啥意思了~
UIViewController目的是用来控制UIView,作为数据层和视图层的业务逻辑承载者,分离界面同业务逻辑。相当于设计模式中的管理者模式。用架构设计来说,就是MVC中的C,即Controller。
1.
- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil
方法类型:动态
参数:1.nibNameOrNil,nib文件的名称,可以输入nil。
2.nibBundleOrNil,NSBundle类型,也就是nib的所在路径。
返回值:instancetype(就是UIViewController,以前是id类型,后来严谨了换成这个类型了)。
功能:使用nib文件来创建一个UIViewController实例。
2.
- (nullable instancetype)initWithCoder:(NSCoder *)coder
方法类型:动态
参数:NSCoder即归档对象
返回值:一个UIViewController实例
功能:就是根据NSCoder来创建UIViewController。例如使用xib进行进行界面的建立,然后链接至某个自定义的UIViewController对象,那么在初始化时系统就会调用这个方法进行初始化建立。因为是要根据xib的数据结构进行建立么。
3.
UIView *view
可修改,属于UIViewController的view。默认为nil,当UIViewController调用加载视图的方法后系统将其赋值,当然也可以进行修改。 从命名上我们能知道UIViewController的含义就是“界面视图控制器”。控制器有了,视图呢?所以这个属性就是控制器的主视图。控制器会自动的控制这个视图的一些行为。关系也就是下图展示的
UIviewController同UIView的关系
可以看到其他需要添加的视图或控件其实都是添加在视图控制器的视图上的。苹果的架构师想的很好,用这个结构强迫开发者使用mvc结构进行编码。事先做好了分层的事情。
4.
- (void)loadView
方法类型:动态
参数:无
返回值:无
功能:如果没有使用nib建立控制器,又需要自定义的控制器的视图,则需要重写该方法,在这个方法中进行对控制器view属性的赋值。例如:
5.
- (void)loadViewIfNeeded (IOS 9.0以后可使用)
方法类型:动态
参数:无
返回值:无
功能:用UIViewController.h中的原话就是加载视图控制器的视图(如果尚未设置)。注意,如果尚未设置。在ios9.0以前如果我们想再次调用loadView方法进行初始化视图,只能使用手动调用的方法,且手动调用loadView方法后,系统也不会再次调用ViewDidLoad的方法,由于我们的初始化代码写在了这两个地方中,缺少一个调用导致程序的不正常,所以手动调用完loadView方法后,我们还要再次手动调用ViewDidLoad方法。
现在ios9.0以后可以仅调用loadViewIfNeeded这个方法就可以使系统先调用loadView,再调用ViewDidLoad方法。但有一个前提就是,当前控制器的视图尚未设置。如果视图已经设置了,就算调用了该方法也不会调用loadView和ViewDidLoad方法。那么什么情况下算未设置呢?请看以下例子
将当前控制器的view属性设置为nil就可以实现该条件。注意不要像我这样写,会引起死循环。写在viewDidAppear方法中我仅仅是图方便而已。
或者在控制器刚创建完时,控制器被创建完未显示时是不会创建其对应的视图的,如果想要创建视图,就需要调用loadViewIfNeeded这个方法。因为这个时候也属于未设置的情况,控制器的view属性这时也为nil。当然直接使用控制器的属性也不是不可以~比如直接调用self.view也可以使控制器的视图创建~在这里仅仅是说明几种情况。
6.
UIView *viewIfLoaded (IOS 9.0以后可使用)
只读,作用为查询当前控制的视图是否被创建,如果创建了就会返回该视图的实例,如果未创建就会返回nil。
感觉是不是有病?可能有的人会说,直接调用视图控制器的view属性查询不就好了,用得着这个吗?用得着,因为view属性在控制器被创建时虽然为空,但当视图需要加在或被使用时就会被创建。举个例子。
标红的部分不会被执行
标红的部分不会被执行,因为当调用控制器的view的属性进行查询时,view就被创建了。等于我们无法判断某个控制器的view属性有没有值,只要查询马上创建。所以viewIfLoaded这个属性就派上用场了,它可以查询当前控制器的视图创建了没有,不会因为查询而导致视图被创建。
这个属性和下面要介绍的viewLoaded属性从功能性上来说是类似的,都是查询控制器的视图是否建立,不同是前者返回实例,后者返回BOOL类型。
7.
- (void)viewDidLoad
方法类型:动态
参数:无
返回值:无
功能:当视图被加载完毕时会被调用,在这里可以进行一部分初始化的工作。比如可以为控制器视图添加别的视图,进行网络连接获得数据准备展示等等。这是被所有人用的最多的一个方法,多说几句,见过非常多的人将大量的视图创建直接写在了这里,我认为这样做基本和苹果的思路背道而驰,控制器的视图可以自定义,应该将对应的视图创建放置在控制器对应的视图上,然后再由控制器来进行加载该视图。除非有一些脱离本控制器的独立业务视图。这样才可以最大程度的实现各层代码分离,来针对来自变化的编程,而不是铁板一块。
8.
BOOL viewLoaded
只读,功能和上面介绍的viewIfLoaded属性类似,只不过一个返回对象,一个不是对象而已。这个方法不限于IOS9.0。放在这里介绍,仅仅是因为在UIViewController.h的顺序~
留言与评论(共有 0 条评论) “” |