初始化UIAlertController的子类

时间:2017-08-26 12:13:50

标签: swift initialization subclass uialertcontroller

我希望创建UIAlertController的自定义子类。 如果我理解正确,我需要在子类初始化期间调用super.init(title...

但是我一直遇到指定初始化程序的问题。我已阅读文档,无法弄清楚如何使其工作。这是我的代码(注意代码中的注释):

class AccountInfoActionSheet: UIAlertController {

    required init?(coder aDecoder: NSCoder) { //xcode says I need this
        super.init(coder: aDecoder) //it also says I need to call a designated initializers so here it is
        super.init(title: "Info", message: "Heres the Info", preferredStyle: .actionSheet) //but now I can't call this initializer
        fatalError("init(coder:) has not been implemented")
    }
}

编辑:由于UIAlertController不能被子类化,我只是创建了一个函数,在ViewController中返回正确配置的UIAlertController

4 个答案:

答案 0 :(得分:5)

你不应该继承UIAlertController

检查此链接:

https://developer.apple.com/documentation/uikit/uialertcontroller#//apple_ref/doc/uid/TP40014538-CH1-SW2

您可以使用extensions添加方法,但不能将其子类化。

答案 1 :(得分:3)

如果您想要一种更简单的方法来创建公共警报控制器,那么您可以执行的操作而不是创建子类是创建UIAlertController的扩展,该扩展具有工厂方法以返回所需的已配置警报控制器的类型。例如:

extension UIAlertController {

    static func accountInfo() -> UIAlertController {
        // If you want to add Alert Actions you can add them to the controller before returning them.
        return UIAlertController(title: "Info", message: "Here's the Info", preferredStyle: .actionSheet)
    }
}

现在您只需使用以下命令创建控制器:

let ac = UIAlertController.accountInfo()

答案 2 :(得分:1)

正如limon's answer to another question所说,你不应该继承UIAlertController

Apple's documentation

  

UIAlertController类旨在按原样使用,但不是   支持子类化。此类的视图层次结构是私有的   不得修改。

答案 3 :(得分:1)

正如其他答案所述,你不应该继承UIAlertController。作为选项,您可以使用工厂方法创建扩展名:

extension UIAlertController {
    static func accountInfoActionSheet() -> UIAlertController {
        return UIAlertController(title: "Title", message: "Message", preferredStyle: .actionSheet)
    }
}

然而,其他答案并不是特别真实,说你不能继承UIAlertController。你不是假设,但如果你愿意,你非常可以

UIAlertControllerUIViewController的子类,因此它们具有相同的指定初始值设定项init(nibName: String?, bundle: Bundle?)

你不应该在init?(coder aDecoder: NSCoder)中调用它,因为它本身就是一个指定的初始化器。例如,当从故事板初始化控制器时,就会调用它。

以下是如何实现您想要的示例(即使Apple不批准):

class AccountInfoActionSheet: UIAlertController {

    // preferredStyle is a read-only property, so you have to override it
    override var preferredStyle: UIAlertControllerStyle {
        return .actionSheet
    }

    init() {
        super.init(nibName: nil, bundle: nil)
        initialize()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        initialize()
    }

    // all of the configuration code that init methods might share
    // separated into a method for the sake of convenience
    private func initialize() {
        title = "Info"
        message = "Heres the Info"
        // any other setup needed
    }
}