簡體   English   中英

如何初始化一個Nib是Storyboard的UIViewController

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM