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