開發(fā)項(xiàng)目我們?yōu)榱丝焖匍_發(fā)一些靜態(tài)的界面,從而選擇使用xib或storyboard進(jìn)行可視化編程.但是當(dāng)他們初始化的時候調(diào)用它的子控件進(jìn)行操作,會發(fā)現(xiàn)它的子控件為nil.界面沒有數(shù)據(jù)展示.下面為大家分享下解決辦法.
1.首先確保UIViewController的初始化正確.
當(dāng)然,新建UIViewController勾選xib
,可以直接使用init
方法,系統(tǒng)會自動調(diào)用init(nibName:bundle:)
方法初始化.
/// 初始化方法
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {}
2.優(yōu)先加載視圖 (一行代碼搞定,簡單粗暴)
這里我們可以在ViewController初始化之后,直接調(diào)用ViewController的loadViewIfNeeded()
方法,隨后即可對子控件進(jìn)行直接操作.
let xibVC = CustomizedXIBViewController.init(nibName: "CustomizedXIBViewController", bundle: nil)
xibVC.loadViewIfNeeded()
/// 下邊對子控件進(jìn)行直接操作
注意:
loadViewIfNeeded()
方法會將viewDidLoad()
方法先執(zhí)行.
如果viewDidLoad()
方法中有對初始化方法傳來的數(shù)據(jù)進(jìn)行特殊操作的話.在執(zhí)行loadViewIfNeeded()
方法之前需要先將傳來的數(shù)據(jù)存儲.確保viewDidLoad()
中能獲取數(shù)據(jù)進(jìn)行操作.
下面是一個例子.
我們?yōu)檫@個Viewcontroller寫個類的初始化方法. contentL
是xib中的UILabel控件. message
是Viewcontroller的一個接收初始化傳來數(shù)據(jù)的屬性.
class func xibVC(contentStr: String, message: String) -> CustomizedXIBViewController {
let xibVC = CustomizedXIBViewController()
/// 1.先存儲要操作的數(shù)據(jù)
xib.message = message
/// 2.再加載視圖
xibVC.loadViewIfNeeded()
/// 3.賦值子控件
xibVC.contentL.text = contentStr
return xibVC
}
override func viewDidLoad() {
super.viewDidLoad()
print("操作message = ", message)
}
viewDidLoad()
方法需要對初始化傳來的message
數(shù)據(jù)進(jìn)行操作,所以需要先將傳來的數(shù)據(jù)存儲到屬性,然后再執(zhí)行loadViewIfNeeded()
,這樣viewDidLoad()
方法就可以拿到屬性存儲的內(nèi)容進(jìn)行操作修改.viewDidLoad()
執(zhí)行完畢后,界面的子控件也已經(jīng)被創(chuàng)建.然后就可以將傳來的contentStr
賦值到contentL.text
中.
如果初始化后不執(zhí)行
loadViewIfNeeded()
方法.那么viewDidLoad()將會在push
或present
后執(zhí)行.
希望對大家有幫助.有不足之處還請指出~