IOS中initWithFrame 和 initWithCoder的區別

從nib中加載對象實例時,init:或initWithFrame:都不會調用。而是調用initWithCoder:怎麼理解:

有時候,知道initWithFrame方法如何用,可是麼有弄明白 initWithFrame方法究竟是什麼?
那就經過查資料弄明白。


1. initWithFrame方法是什麼?

initWithFrame方法用來 初始化並返回一個新的視圖對象,根據指定的CGRect(尺寸)。
固然,其餘UI對象,也有initWithFrame方法,可是,咱們以UIView爲例,來搞清楚initWithFrame方法。

2.何時用initWithFrame方法?
簡單的說,咱們用編程方式申明,建立UIView對象時,使用initWithFrame方法。
在此,咱們必須搞清楚,兩種方式來進行初始化UIView。
1.使用 Interface Builder 方式。
這種方式,就是使用nib文件。一般咱們說的「拖控件」 的方式。

實際編程中,咱們若是用Interface Builder 方式建立了UIView對象。(也就是,用拖控件的方式)
那麼, initWithFrame方法方法是不會被調用的。由於nib文件已經知道如何初始化該View。(由於,咱們在拖該view的時候,就定義好了長、寬、背景等屬性)。
這時候, 會調用initWithCoder方法,咱們能夠用initWithCoder方法來從新定義咱們在nib中已經設置的各項屬性。

這就是爲何使用initWithCoder:的緣由,由於BIDViewController.xib的view是BIDQuartzFunView類型,而不是UIView類型了,因此實際上是從nib中加載對象實例。

2.使用編程方式。
就是咱們聲明一個UIView的子類,進行「手工」編寫代碼的方式。

實際編程中,咱們使用編程方式下,來建立一個UIView或者建立UIView的子類。這時候,將調用initWithFrame方法,來實例化UIView。
特別注意,若是在子類中重載initWithFrame方法,必須先調用父類的initWithFrame方法。在對自定義的UIView子類進行初始化操做。
好比:

- (id)initWithFrame:(CGRect)frame{ 編程

    self = [super initWithFrame:frame];// 先調用父類的initWithFrame方法 ui

    if (self) { 編碼

        

        // 再自定義該類(UIView子類)的初始化操做。 spa

        _scrollView = [[UIScrollView allocinitWithFrame:self.bounds]; code

        [_scrollView setFrame:CGRectMake(00320480)]; orm

        _scrollView.contentSize = CGSizeMake(320*3480); 對象

        

        [self addSubview:_scrollView]; ci

    } it

    return self; scroll

}


在這裏,我想,應該對initWithFrame方法略知一二了。

當咱們所寫的程序裏沒用用Nib文件(XIB)時,用代碼控制視圖內容,須要調用initWithFrame去初始化

- (id)initWithFrame:(CGRect)frame

{

    if (self =[superinitWithFrame:frame]) {

        // 初始化代碼

    }

    return self;

}


用於視圖加載nib文件,從nib中加載對象實例時,使用 initWithCoder初始化這些實例對象

- (id)initWithCoder:(NSCoder*)coder

{

    if (self =[superinitWithcoder:coder]) {

        // 初始化代碼

    }

    return self;

}


1.initWithCoder: 對於.xib,當你嵌入一個視圖對象到xib,視圖加載時默認調用的是該方法;例如:假如建立的view來自nib,那麼將會調用initWithCoder,由系統來調用,本身不能調用。
2.initWithFrame: 非.xib的手動編碼,視圖加載時默認調用的是該方法。是由本身調用,來初始化對象的
相關文章
相關標籤/搜索