如何子类化UIViewController并在swift中添加属性?

时间:2018-05-17 13:53:32

标签: ios swift constructor uiviewcontroller properties

我想在Swift中创建一种新的视图控制器,它具有必须显式初始化的附加属性。这个属性为零或具有默认值没有任何意义,控制器只能以编程方式初始化。我试着像这样定义它:

class MyController : UIViewController {
  var prop: Int
  init(prop: Int) {
    self.prop = prop
    super.init()
  }

  required init(coder aDecoder: NSCoder?) {
    fatalError("don't serialize this")
  }
}

我尝试运行它但它崩溃了,因为super.init()试图运行未定义的nib构造函数,所以我尝试添加:

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

但是现在编译器抱怨prop没有被初始化。这是我的问题:如何在这里正确初始化prop我不想要默认值,我设置的任何内容都会覆盖我在其他初始化程序中设置的正确值

我通过在nib init中设置一些默认值来攻击它,但是让我的第一个init执行此操作

self.prop = prop
super.init()
self.prop = prop

但除了非常奇怪和丑陋之外,这让我担心现在可以从笔尖初始化我的视图控制器并最终得到默认值,这将是不好的。

在Swift中执行此操作的正确和惯用方法是什么?

2 个答案:

答案 0 :(得分:2)

在某些时候,必须通过调用init(nibName:bundle:)init(coder:)来初始化视图控制器

试试这个:

class MyViewController: UIViewController {

    var prop: Int

    init(prop: Int, nibName nibNameOrNil: String? = nil, bundle nibBundleOrNil: Bundle? = nil) {
        self.prop = prop
        super.init(nibName:nibNameOrNil, bundle: nibBundleOrNil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

答案 1 :(得分:0)

尝试以下

class MyController: UIViewController {

    var prop: Int

    required init?(coder aDecoder: NSCoder) {
        fatalError()
    }

    init(prop: Int) {
        self.prop = prop
        super.init(nibName: nil, bundle: nil)
    }
}