記 Xib 自定義 View 的一個(gè)小坑

記 Xib 自定義 View 的一個(gè)小坑


最近版本更新,又不想手寫代碼,所以就借助 xib 了,沒(méi)想到更新版本以后會(huì)出現(xiàn)這個(gè)問(wèn)題.當(dāng)我將控件拉成屬性以后啊,然后呢!就碰到了蛋疼的 bug, 經(jīng)過(guò)一系列的調(diào)試以后,終于發(fā)現(xiàn)了問(wèn)題所在!
下面先對(duì) xib 做一個(gè)簡(jiǎn)單的介紹,希望我們大家少踩點(diǎn)兒坑,又或許踩了能夠立馬知道是什么原因吧!!!

1.File's Owner

重點(diǎn)就是這里了,View和ViewController之間的對(duì)應(yīng)關(guān)系,需要一個(gè)橋梁來(lái)進(jìn)行連接的(即,對(duì)于一個(gè)視圖,他如何知道自己的界面的操作應(yīng)該由誰(shuí)來(lái)響應(yīng)),這個(gè)橋梁就是File's Owner。
選中某個(gè)XIB的File's Owner,在Inspector中可以看到屬性:File Name和Custom Class,該File's Owner就是用來(lái)綁定File Name中的xib文件和Custom Class中的ViewController的,在做了這個(gè)綁定之后,按住control鍵,拖動(dòng)File's Owner到xib中的某個(gè)控件的時(shí)候,就是Custom Class中定義的IBOutlet元素與xib中元素進(jìn)行連接的過(guò)程,同樣,拖動(dòng)"xib中的控件的動(dòng)作"到File's Owner的時(shí)候,就是將xib中該動(dòng)作的響應(yīng)與Custom Class中某個(gè)IBAction進(jìn)行連接的過(guò)程。
因此,在存在多個(gè)xib文件的情況下,
![Uploading 1_020899.png . . .]
即:有多個(gè)View,那么每個(gè)View可以采用不同的ViewController,也可以全部采用相同的一個(gè)ViewController,通過(guò)File's Owner進(jìn)行關(guān)聯(lián)即可。
其實(shí),F(xiàn)ile's Owner就是Custom Class類型的對(duì)象,而xib中的其他元素都是該對(duì)象的成員變量,但是需要手動(dòng)來(lái)關(guān)聯(lián)Custom Class中的成員變量與xib中對(duì)象之間的關(guān)系。


2. First Responder

View中每次只會(huì)有一個(gè)對(duì)象與用戶進(jìn)行交互,那么當(dāng)前交互的對(duì)象即為First Responder。比如點(diǎn)擊文本框,那么此時(shí)文本框就是First Responder。


3. View 這個(gè)也就是我們的視圖了

到這里基本差不多了, 下面簡(jiǎn)單的說(shuō)一下如何使用 xib 自定義一個(gè) view 吧.

  • 創(chuàng)建一個(gè)工程,然后創(chuàng)建一個(gè) view 繼承自 UIView,然后創(chuàng)建一個(gè) 空的view 的 xib 關(guān)聯(lián)起來(lái),也就是名字和創(chuàng)建的 view 的名字一致就好了


    1.png
  • 打開新建的 xib 文件, 分別將 File's Owner 和 view 的 class 設(shè)置為文件名一致


    2.png

    屏幕快照 2017-05-17 下午1.50.32.png
  • 然后我們隨意拖一個(gè)空間進(jìn)去隨意放一下就好了
    寫一個(gè)遍歷構(gòu)造器方法 (名字大家隨意哈)
    // 這個(gè)地方的 Named 也就是xib 的文件名啦,也可以這樣寫 NSStringFromClass([self class]) 你開心就好了??

+(instancetype)initTestView {
    return [[[NSBundle mainBundle] loadNibNamed:@"TestView" owner:nil options:nil] lastObject];
}
  • 再說(shuō)一下view 本身的方法
 -(instancetype)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {     
    }
    return self;
}

眾所周知, 這個(gè)方法只要?jiǎng)?chuàng)建了 xib 一定會(huì)先走這個(gè)方法,這里就不多做處理了,關(guān)于 xib 的 lable 的字體適配可以通過(guò) runtime 交換這個(gè)方法即可,這里就不說(shuō)了 . 如果我們要對(duì)xib 中的一些控件做一些處理的話,那么可以在下面這個(gè)方法里面去是實(shí)現(xiàn)

 -(void)awakeFromNib {
    [super awakeFromNib];
}
  • 下面重點(diǎn)來(lái)了, 將控件拖成屬性,找到控件按住 control, 開始拉到對(duì)應(yīng)的.h 文件或者.m文件 (如下圖)


    屏幕快照 2017-05-17 下午2.00.43.png

    注意左下角的小窗口, 如果是控制器的 xib 文件的話,那么這一個(gè)基本不用管了,因?yàn)槟J(rèn)Object 就是 File's Owner, 至于為什么,請(qǐng)看上文 . 但是如果是自定義的 view, 那么 object 請(qǐng)選擇 "Test View" , 這樣才能算是關(guān)聯(lián)起來(lái)了! 如果是第一個(gè)的話, 那么會(huì) crash 掉 :
    libc++abi.dylib: terminating with uncaught exception of type NSException
    原因就是:
    Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSObject 0x600000004e40> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key Btn.' 這樣的話如何修改呢? 難道要我刪除重新拉線嗎,會(huì)不會(huì)太麻煩了,下面請(qǐng)看圖


    屏幕快照 2017-05-17 下午2.08.00.png

    打開創(chuàng)建的 xib -> 右鍵控件 -> Referencing Outlets 下面 File's Owner 右邊的實(shí)心遠(yuǎn)點(diǎn)拉線至 "Test View" 下面會(huì)多一個(gè), File's Owner 刪除即可 !
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • view.xib的說(shuō)明View的custom cass是關(guān)聯(lián)自身的 File’s owner是關(guān)聯(lián)任意類的 方式...
    此晨閱讀 2,472評(píng)論 1 4
  • 首先聲明,我這是根據(jù)別人的講解來(lái)寫出來(lái)的,,, 一、關(guān)于xib 1.xib和nib 在程序里面我們看到的基本上是U...
    湮滅_塵事閱讀 3,620評(píng)論 1 14
  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,210評(píng)論 30 471
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,287評(píng)論 25 708
  • 往后的日子我們都會(huì)好好在一起。我希望你每天都開心快樂(lè)健康成長(zhǎng),即使跌倒了也不要緊,有我們?cè)谝黄穑阌赂业孛鎸?duì)爬起來(lái)...
    星月菩提子閱讀 296評(píng)論 0 0