Swift:使用自定义参数初始化UIViewController子类

时间:2015-09-28 08:17:34

标签: ios swift initialization

问题: 我有一个视图控制器,它包含两个变量,没有它们控制器无法工作。因此,根据概念,这些变量是强制性的或非可选的。

但是,我声明它们是可选的,这导致几乎每个方法的第一行中的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)

有什么想法吗?

1 个答案:

答案 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中没有合适的初始化程序。