引言
之前說了xib的優(yōu)缺點宣鄙、如何應(yīng)用、解決文件沖滞诺,算掃了xib學(xué)習(xí)上的一只攔路虎,現(xiàn)在我們就開始具體的學(xué)習(xí)一下xib的簡單使用媳搪。
建立Demo工程
新建基于single view application的工程铭段,取名叫xibDemo,建好之后就有一個Main.storyboard文件秦爆,因為SB功能比xib強大序愚,這里我們先講xib的用法,再講SB的用法等限,學(xué)會了xib爸吮,就已經(jīng)學(xué)了70%的SB芬膝。一天一點xib:2初識xib說過:
xib的使用一般基于UIViewController或UIView類的子類
我們現(xiàn)在分別創(chuàng)建他們的子類SecondVC和TestView極其對應(yīng)的xib文件。
基于UIViewController的xib
點擊SecondVC.xib形娇,為了顯示全锰霜、演示方便,去掉size classes功能(具體方法參見:一天一點xib:2初識xib)
第一個標(biāo)簽
主要介紹了xib文件的一些基本信息桐早,一般不用修改癣缅。是否開啟auto layout、size classes哄酝、launch screen等功能在interface builder document菜單下友存,這幾個功能以后會詳細介紹。
Localization菜單是與國際化相關(guān)的陶衅,一天一點xib:8高冷的xib中有介紹屡立,這里只介紹xib的常用功能。
下面紅色區(qū)域是xib可操作的對象搀军,這里不隨上面標(biāo)簽切換而切換膨俐,固定顯示,是xib操作中的重點區(qū)域罩句,包括各種UI控件焚刺、手勢、Controller等等门烂,大家應(yīng)該仔細看看里面的東西檩坚。
第二個標(biāo)簽
是一些幫助說明之類的東西,可以忽略诅福,應(yīng)用中不會用到
第三個標(biāo)簽
該標(biāo)簽中最經(jīng)常用到的就是Custom Class菜單中的Class拖叙,一般就是將你的類與xib文件掛鉤薯鳍,我們這里的SecondVC.xib中的View如果要設(shè)置成你自定義的View的話就改變這個屬性挖滤,我們將一個xib與一個UIView子類進行綁定的時候也是改變這個屬性的斩松,這是一個很重要的屬性。
User Define Runtime Attribute是一個不經(jīng)常用乳幸,但是很有用的功能粹断,一天一點xib:8高冷的xib中有詳細說明瓶埋。
其他菜單都不常用,其中Accessibility是支持給殘疾人開發(fā)更利于他們使用的app的時候用到的曾撤。
第四個標(biāo)簽
這個是屬性標(biāo)簽,是xib中最重要的一個標(biāo)簽兵多,對應(yīng)的是一個控件的可設(shè)置的一些屬性剩膘,根據(jù)你選擇的控件不同怠褐,屬性標(biāo)簽中呈現(xiàn)出來的東西也是不同的奈懒,這里的屬性與代碼中設(shè)置的基本相同磷杏,大家可以試試,如果大家對哪個控件不熟悉慈格,可以拖出一個控件到View上浴捆,然后切換到該標(biāo)簽选泻,看看里面都有什么屬性滔金,然后改變他們的屬性值餐茵,運行忿族,看看變化道批,這樣可以快速、簡單的學(xué)習(xí)一個控件椭岩,或者以xml的形式去看看xib的代碼判哥。
屬性標(biāo)簽是最經(jīng)常和我們打交道的一個標(biāo)簽塌计。
顏色設(shè)置這里有幾個小技巧:
1.在Hex Color里設(shè)置代表一種顏色的十六進制數(shù)
2.通過Opacity改變顏色的透明度锌仅。
注意:改變顏色的透明度有時候很重要热芹,它與直接改變view的alpha產(chǎn)生的效果不同剿吻,改變view的alpha,它的subView的alpha也會改變纺棺,而改變顏色的alpha祷蝌,是不影響自己的subView的巨朦。
3.點擊左下角的吸管,移動它到你需要設(shè)置的顏色處拄查,點擊鼠標(biāo)堕扶,此時顏色就變成了你需要的那種顏色稍算,十分方便糊探、快捷科平。
UIButton等控件是有不同狀態(tài)的:Default匠抗、Highlighted汞贸、Selected矢腻、Disabled多柑,可以針對不同的狀態(tài)設(shè)置不同的屬性值竣灌,還可以設(shè)置shadow初嘹、edge等屬性沮趣,十分方便。
第五個標(biāo)簽
這是與控件frame相關(guān)的標(biāo)簽,該標(biāo)簽里的屬性隨著控件類型不同而變化类溢,最典型的例子是Cell谴蔑,是否開啟auto layout也會影響該標(biāo)簽中的屬性隐锭,但一般常用的就是設(shè)置x钦睡、y荞怒、Width褐桌、Height,我們給一個控件添加的layout約束也都在這里顯示呛踊,如果在控件上直接修改不方面的話谭网,可以到這個標(biāo)簽下查看和修改,十分方便锥涕。
第六個標(biāo)簽
該標(biāo)簽主要負(fù)責(zé)xib文件和類的源文件交互用搏嗡,都是“連線”相關(guān)的操作,例如UITableView的delegate與datasoutce尺栖,IBAction、IBOutlet等相關(guān)叉橱,如果我們用了xib的頁面產(chǎn)生了莫名其妙的crash那你就要看看是不是自己的“連線”有問題了掐松。
“連線”是xib中最為重要的東西,在講“連線”之前杠愧,先說一個很重要流济、但又不容易說清的東西:Files Owner袭灯。
Files Owner指這個xib文件的所屬文件是誰,簡單的說是xib文件和誰建立起交互姨丈,用戶通與該xib呈現(xiàn)的頁面進行交互的時候,誰來處理背后的邏輯歼争。具體來講xib文件能拖動“連線”到哪個源文件中去建立IBAction俩莽、IBOutlet、delegate出刷、datasource等。
一般基于View創(chuàng)建的xib的Files Owner都指定為一個VC屁柏。基于VC創(chuàng)建的xib裸删,創(chuàng)建的時候系統(tǒng)就已經(jīng)把該xib文件的Files Owner指向了該VC,一般這種情況就不對Files Owner做修改了匕荸。
設(shè)置Files Owner也是通過之前說的很重要的第三個標(biāo)簽下的Custom Class->Class來操作的,F(xiàn)iles Owner践惑、Custom Class的深入了解不是一蹴而就的,要在不斷地學(xué)習(xí)和應(yīng)用中去體會侦铜,后面會有例子涉及到他們到時候認(rèn)識會更深钉稍。
IBAction:
“連線”的一種烈掠,用于標(biāo)記方法瘾蛋,此方法是將Files Owner中的方法,與xib中的某個對象通過“連線”建立起關(guān)系取董。該“連線”就相當(dāng)于在代碼中加入了addTarget等方法,等到xib顯示的對象與用戶發(fā)生交互時蹂午,就會調(diào)用IBAction修飾的這個方法。
建立IBAction連線的方法:
1.選中需要連線的對象晚胡,按住control鍵,拖動該控件到Files Owner類的@implementatio中松手忿檩,填寫方法名即可沙咏。
2.先在@implementatio中定義一個方法,在返回值中寫IBAction,然后點擊前面的空心圓理盆,拖動到xib的對象上猿规,兩者就建立了“連線”的關(guān)系蘸拔。
查看xib中某個對象的“連線關(guān)系”:
1.選中某個對象积担,右鍵鼠標(biāo)先誉。
注意:有時一個“連線”產(chǎn)生的crash可能是由于你連線錯誤而產(chǎn)生的,例如一個Button铃芦,你線的Events卻是valueChanged:這樣就產(chǎn)生crash,而這種情況往往是Xcode自動選擇了不對的Event咧虎,之前Xcode版本中總會有這樣的問題砰诵,現(xiàn)在的Xcode基本上沒有這樣的問題了总寒,這里要注意看Event的類型,鏈接的selector是否是匹配的贪薪。
2.在第六個標(biāo)簽中直接查看。
IBOutlet
也是“連線”的一種囱怕,用于標(biāo)記屬性或變量,此方法將Files Owner中的屬性或字段台丛,與xib中的某個對象通過“連線”建立起關(guān)系。
IBOutlet建立“連線”與查看“連線”的方法與IBAction相同侠坎。但要注意的是:如果拖動“線”到@interface里实胸,就生成屬性,如果拖動到@interface{}里或者拖動“線”到@implementatio中的{}里就生成變量门躯。
這里簡單說一下:在@implementation中{}里寫變量和在@interface XXClass()(匿名Category)里的{}中寫變量是一樣的宁否,都是匿名的。
@interface ViewController () {
NSString *_name;
}
@end
@implementation ViewController {
NSString *_anotherName;
}
- (void)viewDidLoad {
[super viewDidLoad];
}
@end
注:要刪除連線台谊,不僅要把Files Owner中的代碼刪除,還要找到xib中對應(yīng)的對象盐须,右鍵點擊x刪除贼邓,或直接選擇第六個標(biāo)簽點擊x刪除。
建立delegate统舀、datasource和tableView的“連線”:
用xib建立delegate、datasource和tableView的“連線”描融,就相當(dāng)于在Files Owner中寫了如下代碼:
_testTableView.delegate = self;
_testTableView.datasource = self;
值得借鑒的點:
這里值得我們借鑒的一點在于:基于View創(chuàng)建的xib,是可以“連線”到自己View所在類中的年叮,如果給該xib設(shè)置了Files Owner的屬性后只损,可以同時“連線”到Files Owner的類中叮叹。
這有什么用呢?
我們可能會遇到這種情況:要封裝一個View為一個單獨的類携冤,該View是可交互的曾棕,點擊后翘地,要發(fā)生變化子眶,同時又要把交互的事件傳遞給VC,如果用代碼的話粤咪,就要把事件從View類傳遞給VC類宪塔,而如果你封裝的類用了xib,那么事情就簡單多了,同時“連線”到View類和自己Files Owner類對應(yīng)的VC中蜜托,在View類中處理UI的變化,在VC中處理邏輯,而不需要任何事件的傳遞重挑,當(dāng)用戶交互的時候嗓化,這兩根“連線”都會被回調(diào)。
基于UIView的xib
基于UIView的xib幾乎與基于UIViewController的一樣谬哀,每個標(biāo)簽顯示的東西都是差不多的刺覆。
要切記初始化View不走initWithFrame:而是走initWithCoder:即可。
小小技巧
可以用command + c玻粪、command + v對控件進行復(fù)制粘貼隅津,但粘貼后的控件復(fù)制了原有控件的所有屬性充蓝,包括所有的“連線”协怒,如果一個login的button“連線”了一個回調(diào)函數(shù)-(void)login;我們復(fù)制了這個button起名為register,但是點擊該按鈕,它還是會調(diào)用-(void)login;這通常不是我們想要的沮翔,所以在復(fù)制控件之后要斷了它之前的所有“連線”承二。初學(xué)者尤其要切記。
再次強調(diào):在使用xib過程中產(chǎn)生了一些Crash袁滥,首先檢查的就是控件的“連線”是否正確嵌赠。
總結(jié)
就此我們已經(jīng)介紹了4篇關(guān)于xib的東西彼硫,已經(jīng)可以對xib進行簡單的應(yīng)用了缺虐,xib使用的重點就是右邊欄下部的可操作對象腰涧,和他們對應(yīng)的六個標(biāo)簽、及其xib的使用方法关划。
歡迎大家和我交流溝通踊赠,若文章中有錯誤和紕漏鸽斟,懇請指正立倍,謝謝。