在子类中使用init

时间:2018-12-30 01:33:52

标签: swift subclass init

我有一个超类ViewController

class ViewController : UIViewController { /* no init here */ }

我有很多继承自ViewController的viewControllers 例如,这个

class AddHoraire : ViewController { /* I want an init for this class */ }

我可以初始化一个子类吗?它问我是否也需要我单击修订的init,但是我需要用什么写吗?

这是错误: http://www.noelshack.com/2018-52-7-1546133576-93491c85-f2eb-4b8a-bfff-35ae5763c59a.jpeg

2 个答案:

答案 0 :(得分:0)

您通常不会为UIViewController的子类定义新的初始化器。这样做将需要您使用这些确切的签名覆盖init(coder:)init(nibName:, bundle:),因此无法为自定义属性提供值。

在您的自定义VC中添加一个设置功能,并在文档中提到必须在准备好使用VC之前调用它:

class AddHoraire : ViewController {
    var anInt: Int!
    var aString: String!

    /// This method must be called before this class is ready for use
    func setup(anInt: Int, aString: String) {
        loadViewIfNeeded() // in case you need to access the outlets
        self.anInt = anInt
        self.aString = aString
    }
}

用法:

let vc = AddHoraire()
vc.setup(anInt: 42, aString: "Hello world")

答案 1 :(得分:0)

尝试初始化时,

init(SelectedDay: String) {
    super.init()
    selectedDay = SelectedDay
}

您遇到错误,“必须调用超类ViewController的指定初始化程序”

由于您没有在ViewController上定义指定的初始值设定项,因此您将继承其超类UIViewController(即init(nibName: String?, bundle: Bundle?))的指定初始值设定项。

要解决此问题,请向ViewController添加一个初始化程序。让它调用指定的初始化程序。您还必须应用修复程序来生成init?(coder:)

class ViewController: UIViewController {
    init() {
        super.init(nibName: nil, bundle: nil)
    }

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

然后回到AddHoraire,假设您拥有selectedDay属性。必须在调用super.init()之前 进行设置。我也建议不要大写参数名称。只需使用相同的名称,然后使用self.来识别属性即可区分参数和属性。

class AddHoraire : ViewController {
    private let selectedDay: String

    init(selectedDay: String) {
        self.selectedDay = selectedDay
        super.init()
    }

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