问题: 我有一个视图控制器,它包含两个变量,没有它们控制器无法工作。因此,根据概念,这些变量是强制性的或非可选的。
但是,我声明它们是可选的,这导致几乎每个方法的第一行中的guard语句。 使它们成为可选的原因是:
storyboard?.instantiateViewControllerWithIdentifier
初始化控制器,所以没有办法(据我所知)定义我自己的初始化器,它接受必要的值。这显然是我最喜欢的解决方案。变量声明:
var dataSource : MyDataSource?
var cellAndHeaderManager: MyCellAndHeaderManager?
典型方法开始:
guard let cellAndHeaderManager = cellAndHeaderManager else {return UICollectionReusableView()}
let header = cellAndHeaderManager.headerForSection(collectionView, indexPath: indexPath)
guard let dataSource = dataSource else {return header}
初始化:
if let newController = storyboard?.instantiateViewControllerWithIdentifier("MyViewController") as? MyCollectionViewController {
newController.dataSource = dataSource
newController = cellAndHeaderManager
}
我想做什么:
newController = MyCollectionViewController(dataSource, cellAndHeaderManager)
有什么想法吗?
答案 0 :(得分:2)
您可以为视图控制器编写class func
:
class MyViewController {
// ...
class func instantiate(dataSource: MyDataSource, cellAndHeaderManager: MyCellAndHeaderManager) -> MyViewController {
let vc = UIStoryboard(name: "Storyboard", bundle: nil).instantiateViewControllerWithIdentifier("MyViewController") as! MyViewController
vc.dataSource = dataSource
vc.cellAndHeaderManager = cellAndHeaderManager
return vc
}
}
所以你可以用:
实例化它let vc = MyViewController.instantiate(dataSource: dataSource, cellAndHeaderManager: cellAndHeaderManager)
您无法使用初始化程序从Storyboard实例化视图控制器,因为UIViewController
中没有合适的初始化程序。