我有UITextView的子类,它需要具有特定的默认外观。到目前为止,我已经能够通过重写initialize()类函数来实现此目的,该函数已在Swift 3.1中弃用。

public class CustomTextView : UITextView {
    override public class func initialize() {
        self.appearance().backgroundColor = .green
    }
}

有没有一种方法可以实现相同的纯Swift功能?

最佳答案

我正在通过使用这样的构造来解决类方法initialize的丢失:

class CustomTextView : UITextView {
    override init(frame: CGRect, textContainer: NSTextContainer?) {
        super.init(frame:frame, textContainer: textContainer)
        CustomTextView.doInitialize
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder:aDecoder)
        CustomTextView.doInitialize
    }
    static let doInitialize : Void = {
        CustomTextView.appearance().backgroundColor = .green
    }()
}

这种构造的优点是doInitialize仅初始化一次,因此与它关联的代码将仅运行一次(在这种情况下,我们将仅配置外观代理一次);而且还早就影响了创建的第一个实例(也就是说,您制作的每个CustomTextView实际上都是绿色的)。

09-12 07:51