CustomView
和 CustomView.xib
之間并沒有直接的代碼關(guān)聯(lián),它們的關(guān)聯(lián)實(shí)際上是通過手動(dòng)設(shè)置 File's Owner
和 xib
的加載代碼來實(shí)現(xiàn)的逆粹。因此募疮,是否設(shè)置 CustomView
作為 CustomView.xib
的 class
和 File's Owner
,取決于你是否希望通過 CustomView.xib
與 CustomView
類進(jìn)行交互(例如僻弹,連接 IBOutlet
或處理 IBAction
)阿浓。下面是詳細(xì)解釋:
-
CustomView.xib
的class
和File's Owner
的設(shè)置
File's Owner
:決定哪個(gè)對(duì)象擁有(控制)這個(gè).xib
文件中的視圖和控件。它是一個(gè)占位符蹋绽,表示當(dāng).xib
文件加載時(shí)芭毙,哪個(gè)類會(huì)處理控件的IBOutlet
和IBAction
筋蓖。如果你希望將CustomView.xib
中的控件和CustomView
類的IBOutlet
進(jìn)行連接,則File's Owner
必須設(shè)置為CustomView
稿蹲。
-
CustomView.xib
中的class
:這僅用于指定.xib
文件中的頂級(jí)視圖的類類型扭勉。如果你希望.xib
文件的頂級(jí)視圖是CustomView
類的實(shí)例鹊奖,那么你可以將class
設(shè)置為CustomView
苛聘。否則,默認(rèn)的UIView
也可以忠聚。- 是否必須設(shè)置
CustomView
為class
和File's Owner设哗?
- 是否必須設(shè)置
File's Owner
設(shè)置為CustomView
:
必須這樣做如果你希望通過IBOutlet
和IBAction
與CustomView
交互。設(shè)置File's Owner
為CustomView
是必要的两蟀,因?yàn)檫@告訴系統(tǒng)网梢,CustomView
類將負(fù)責(zé)管理.xib
文件中的視圖和事件。xib
頂級(jí)視圖的class
設(shè)置為CustomView
:
這不是嚴(yán)格必要的赂毯,除非你希望.xib
頂級(jí)視圖的類型是 CustomView战虏。如果頂級(jí)視圖是UIView
或其他類,它也可以正常工作党涕,視具體需求而定烦感。- 常見的使用場景和如何設(shè)置
場景 1:CustomView
是一個(gè)自定義視圖,并希望加載和顯示 CustomView.xib
中的控件
在這個(gè)情況下:
File's Owner:應(yīng)該設(shè)置為 CustomView
膛堤,以便在加載時(shí)將 .xib
文件中的控件連接到 CustomView
類的 IBOutlet
手趣。
class:可以是 CustomView
,這樣 .xib
文件的頂級(jí)視圖就是 CustomView
類的實(shí)例肥荔。
實(shí)現(xiàn)步驟:
1.在 xib
文件中绿渣,設(shè)置 File's Owner
為 CustomView
。
2.設(shè)置 CustomView.xib
頂級(jí)視圖的 class
也為 CustomView
燕耿。
3.編寫代碼加載 CustomView.xib
并將其內(nèi)容添加到視圖中:
class CustomView: UIView {
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var imageView: UIImageView!
override init(frame: CGRect) {
super.init(frame: frame)
loadFromNib()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
loadFromNib()
}
private func loadFromNib() {
let nib = UINib(nibName: "CustomView", bundle: nil)
if let view = nib.instantiate(withOwner: self, options: nil).first as? UIView {
view.frame = self.bounds
addSubview(view)
}
}
}
場景 2:CustomView
只是容器中符,而 .xib
視圖是其他類類型(如 UIView
)
如果 CustomView
是一個(gè)簡單的視圖容器,你不需要將File's Owner
或頂級(jí)視圖 class
設(shè)置為 CustomView
誉帅。在這種情況下舟茶,你可以讓 .xib
頂級(jí)視圖保持為 UIView(或其他),而不必與 CustomView
類強(qiáng)關(guān)聯(lián)堵第。
例如:
-
File's Owner
:可以設(shè)置為nil
吧凉,因?yàn)椴恍枰c類的屬性進(jìn)行綁定。 -
class
:可以設(shè)置為UIView
踏志,因?yàn)槟悴恍枰远x行為阀捅。
這種情況下,加載 xib
時(shí)不需要綁定 File's Owner
针余,只需添加頂級(jí)視圖即可:
class CustomView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
loadFromNib()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
loadFromNib()
}
private func loadFromNib() {
let nib = UINib(nibName: "SomeOtherView", bundle: nil)
if let view = nib.instantiate(withOwner: nil, options: nil).first as? UIView {
view.frame = self.bounds
addSubview(view)
}
}
}
總結(jié)
File's Owner
:必須設(shè)置為 CustomView
如果你希望通過 IBOutlet
和 IBAction
進(jìn)行交互饲鄙。
class
:頂級(jí)視圖的 class
是否為 CustomView
取決于你是否希望 .xib
文件的頂級(jí)視圖是 CustomView
類的實(shí)例凄诞。如果不需要特殊的自定義行為,可以保留為 UIView
忍级。