您的位置:首页 > 其它

VC和view一些方法调用顺序

2016-09-27 00:00 197 查看
UIView的layoutSubviews和drawRect方法何时调用 http://blog.sina.com.cn/s/blog_afb4d07f0101iamg.html

loadView和viewDidLoad

loadView和viewDidLoad是iPhone开发中肯定要用到的俩个方法,他们都可以用来在试图载入的时候初始化一些内容,但是他们有什么区别呢?

我在Xcode7.3.1上试验,不管是从xib创建views还是代码创建views,这俩个方法都会走,而且是先走前者,再走后者。

创建一个类和实例化一个类.在XCode中创建一个类和实例化一个类很容易区分,但是在IB(Interface Builder)中有时候就会迷糊.其实也很好区分,孤零零地创建了一个nib文件,没有和其他可被实例化的类有直接或间接关系的时候,这个类或这些类(一个nib文件俺也可能包含多个类)是没有机会被实例化的,所以这种情况只是通过ib创建了一个类,而没有实例化.真正的实例化还需要通过在Xcode用代码来读取这个nib文件.知道这两这的区别后这些方法也就容易辨认多了

viewDidLoad其实没什么可混淆的,无论通过什么途径加载(Xcode或者IB,这里的加载属于实例化)完view后肯定会执行这个方法.

loadView需要分两种情况.当你通过Xcode实例化一个类的时候就需要自己在controller中实现这个方法.而在IB中实例化就不需要实现它.但如果你实现它,它也会调用,而且是在viewDidLoad之前,当然在它的实现里可以什么都不做。

UIView中一些重要方法initWithFrame、initWithCoder、awakeFromNib、drawRect何时调用

initWithFrame、initWithCoder、awakeFromNib、drawRect这几个方法在自定义控件的时候,会经常调用,具体什么情况下会调用哪个方法下面总结

-(id)initWithFrame:当控件不是从xib、storyboard中创建时,会调用这个方法

-(id)initWithCoder:当控件是从从xib、storyboard中创建时,会调用这个方法

-(void)awakeFromNib这个方法在-(id)initWithCoder:方法后调用

可以理解为:经过-(id)initWithCoder:创建出来的控件是死的,然后通过awakeFromNib来唤醒,所以会有一个先后的调用顺序。

这3个方法都需要调用[super ],调用其父视图的对应方法

一般来说,为了安全起见,初始化控件的代码我们写在一个方法里面,然后我们分别在initWithFrame和initWithCoder中都调用一下,这样就保证了无论你是通过什么方式创建的控件,代码都能起作用。

-(void)drawRect:方法不论用代码创建实例还是xib创建,如果实现了都会调用到的。调用顺序经实验是:

/*
xib创建实例
13:23:10.005 UIView9.26[20419:10042299] -[MyView initWithCoder:]
13:23:10.007 UIView9.26[20419:10042299] -[MyView awakeFromNib]
13:23:10.007 UIView9.26[20419:10042299] -[ViewController viewDidLoad]
13:23:10.014 UIView9.26[20419:10042299] -[MyView drawRect:]
*/

/*
代码创建实例
13:26:58.854 UIView9.26[20432:10043790] -[ViewController viewDidLoad]
13:26:58.855 UIView9.26[20432:10043790] -[MyView initWithFrame:]
13:26:58.861 UIView9.26[20432:10043790] -[MyView drawRect:]
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: