[英]How to init a UIViewController whose Nib is the Storyboard
我有以下UIViewController
:
class ViewController: UIViewController{
var dayDatasource : DayDatasource;
init(){
self.dayDatasource = DayDatasource();
super.init(nibName:nil, bundle: nil);
}
required init?(coder aDecoder: NSCoder) {
self.dayDatasource = DayDatasource();
super.init(nibName:nil, bundle: nil);
}
override func viewDidLoad() {
super.viewDidLoad();
}
}
現在,因為我聲明了dayDatasource
屬性,所以swift迫使我創建了init
方法。 當我創建init
方法時,它會抱怨我需要為UIViewController
調用指定的init
方法。 谷歌搜索之后,顯然指定的`init方法是:
super.init(nibName:nil, bundle: nil);
但是,當我使用此功能時,會出現后退屏幕。 如果我嘗試以下操作:
super.init(nibName:"ViewController", bundle: NSBundle.mainBundle());
我收到以下錯誤:
無法在捆綁包中加載NIB:“ NSBundle”
在這種情況下我該怎么辦?
你應該這樣寫:
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
而不將nibName
傳遞為nil或進行硬編碼。
如果這可以解決您的問題,請在評論中讓我知道
如果您使用情節提要劇集進行導航,則應將dayDatasource
為可選,或使用?
強制展開?
或!
。 這樣可以避免要求您創建未使用的init方法。
然后,在要從中導航的視圖控制器中,覆蓋func prepare(for segue: UIStoryboardSegue, sender: Any?)
函數並設置dayDatasource
變量。
另一方面,如果這是第一個顯示的視圖控制器,或者您始終想要dayDatasource
的新實例,只需在變量聲明中創建該實例即可,並且不再需要自定義init。
var dayDatasource = DayDatasource()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.