如何在UIAlertController中为swift覆盖便利init?

时间:2015-10-13 01:16:16

标签: ios swift uialertcontroller

我试图在UIAlertController中覆盖便利init,但它给了我一个错误,例如'初始化程序不会覆盖其超类的指定初始化程序'。 我怎样才能使用继承或扩展来覆盖它呢? 我的代码如下。

import UIKit

class ColorAlertViewController: UIAlertController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }

    override convenience init(title: String?, message: String?, preferredStyle: UIAlertControllerStyle, colorCode: String?){
        super.init(title: title, message: message, preferredStyle: preferredStyle)
    }
}

3 个答案:

答案 0 :(得分:4)

你没有覆盖任何便利init,看起来你正在创建一个新的。

convenience init(title: String?, message: String?, preferredStyle: UIAlertControllerStyle, colorCode: String?){
    self.init(title: title, message: message, preferredStyle: preferredStyle)
}

可能就是你想要的,你只需要处理颜色代码

看起来你将不得不绕道而行:

首先创建一个创建扩展

extension UIAlertController
{

    class func create(title: String?, message: String?, preferredStyle: UIAlertControllerStyle) -> AnyObject
    {
        return UIAlertController(title: title, message: message, preferredStyle: preferredStyle);
    }
}

然后在ColorAlertViewController中,您将创建另一个函数来创建此对象:

class func createWithColor(title: String?, message: String?, preferredStyle: UIAlertControllerStyle, colorCode: String?) -> AnyObject
{
    var c = super.create(title, message: message, preferredStyle: preferredStyle);
    //handle color code here
    return c;
}

现在您想要创建此对象的任何地方,只需调用

即可
var colorAlertView = ColorAlertViewController.createWithColor("title Name", message: "the message", preferredStyle: .ActionSheet, colorCode: "the color");

当然,这不会在UI构建器中工作,您必须通过代码创建它。

答案 1 :(得分:1)

您确实应该将其包装在类中而不是覆盖。这样,您的包装器类就可以执行对调用者隐藏的活动。

Apple确实明确声明UIAlertViewController不应从以下继承:

  

重要

     

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

实施:

extension UIAlertController
{
    class func create(title: String?, message: String?, preferredStyle: UIAlertControllerStyle) -> AnyObject
    {
        return UIAlertController(title: title, message: message, preferredStyle: UIAlertController.Style.alert);
    }
}

class ColorAlertController {
    private var alertController: UIAlertController!

    private init() {
    }

    public convenience init(title: String?, message: String?, initialValue: T) {
        self.init()
        alertController = UIAlertController.createAlert(title: title, message: message)
        ... do color stuff ...
    }
}

ColorAlertController还可以包含一些模式表示功能。

func present(inViewController controller: UIViewController) {
    controller.present(alertController, animated: true)
}

您可以通过将UIAlertControllers包装在这样的自定义模式控制器中来做一些非常酷的事情。其余的魔法取决于您。

答案 2 :(得分:0)

似乎无法做到这一点“覆盖”。

根据此answer,您似乎需要在添加自定义init之前“覆盖”原点init

class ColorAlertViewController: UIAlertController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }

    convenience init(title: String?, message: String?, preferredStyle: UIAlertControllerStyle) {
        self.init(title: title, message: message, preferredStyle:preferredStyle)
    }

    convenience init(title: String?, message: String?, preferredStyle: UIAlertControllerStyle, colorCode: String?){
        self.init(title: title, message: message, preferredStyle: preferredStyle)
        // handle colorCode
    }

}

此代码没有编译错误。但是这会在运行时导致无限循环。