如何初始化其Nib是Storyboard的UIViewController

时间:2016-08-30 19:20:31

标签: ios swift uiviewcontroller

我有以下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方法时,它会抱怨我需要为init调用指定的UIViewController方法。谷歌搜索后,显然指定的`init方法是:

super.init(nibName:nil, bundle: nil);

但是当我使用它时,我会得到一个后屏幕。如果我尝试以下内容:

super.init(nibName:"ViewController", bundle: NSBundle.mainBundle());

我收到以下错误:

  

无法在捆绑中加载NIB:'NSBundle'

在这种情况下我该怎么做?

2 个答案:

答案 0 :(得分:0)

你应该这样写:

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)   {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}

未将nibName传递给nil或硬编码。

如果这可以解决您的问题

,请在评论中告诉我

答案 1 :(得分:0)

如果您使用故事板segue进行导航,则应使用dayDatasource?!设为可选或强制解包的可选项。这将阻止您要求您创建未使用的init方法。

然后,在您导航的视图控制器中,覆盖func prepare(for segue: UIStoryboardSegue, sender: Any?)函数并设置dayDatasource变量。

另一方面,如果这是第一个正在显示的视图控制器,或者您总是需要dayDatasource的新实例,只需在变量声明中创建实例,就不再需要自定义init。

var dayDatasource = DayDatasource()