我如何覆盖 swift 的 UIAlertController 中的便利初始化?
How can I override convenience init in UIAlertController for swift?
我试图覆盖 UIAlertController 中的便利初始化,但它给了我一个类似 'initializer does not override a designated initializer from its superclass' 的错误。
我如何使用继承或扩展覆盖它?
我的代码如下。
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)
}
}
您没有覆盖任何便利的 init,看起来您正在创建一个新的。
convenience init(title: String?, message: String?, preferredStyle: UIAlertControllerStyle, colorCode: String?){
self.init(title: title, message: message, preferredStyle: preferredStyle)
}
大概就是你想要的,你只需要处理颜色代码
看来你将不得不绕一圈:
首先创建一个create extension
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 构建器中不起作用,您必须通过代码创建它。
似乎没有办法做到这一点"override"。
根据此 answer,您似乎需要 "override" 来源 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
}
}
这段代码没有编译错误。然而,这会在运行时导致无限循环。
您真的应该将其包装在 class 中而不是覆盖。这样你的包装器 class 就可以执行对调用者隐藏的活动。
Apple 确实明确声明 UIAlertViewController 不会继承自:
Important
The UIAlertController class is intended to be used as-is and does not
support subclassing. The view hierarchy for this class is private and
must not be modified.
实施:
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)
}
您可以像这样将 UIAlertController 包装在自定义模态控制器中,从而做一些非常酷的事情。剩下的魔法就看你了。
我试图覆盖 UIAlertController 中的便利初始化,但它给了我一个类似 'initializer does not override a designated initializer from its superclass' 的错误。 我如何使用继承或扩展覆盖它? 我的代码如下。
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)
}
}
您没有覆盖任何便利的 init,看起来您正在创建一个新的。
convenience init(title: String?, message: String?, preferredStyle: UIAlertControllerStyle, colorCode: String?){
self.init(title: title, message: message, preferredStyle: preferredStyle)
}
大概就是你想要的,你只需要处理颜色代码
看来你将不得不绕一圈:
首先创建一个create extension
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 构建器中不起作用,您必须通过代码创建它。
似乎没有办法做到这一点"override"。
根据此 answer,您似乎需要 "override" 来源 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
}
}
这段代码没有编译错误。然而,这会在运行时导致无限循环。
您真的应该将其包装在 class 中而不是覆盖。这样你的包装器 class 就可以执行对调用者隐藏的活动。
Apple 确实明确声明 UIAlertViewController 不会继承自:
Important
The UIAlertController class is intended to be used as-is and does not support subclassing. The view hierarchy for this class is private and must not be modified.
实施:
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)
}
您可以像这样将 UIAlertController 包装在自定义模态控制器中,从而做一些非常酷的事情。剩下的魔法就看你了。