设置UIView子类的默认外观而不覆盖Swift 3.1中的initialize()

时间:2017-03-31 01:44:55

标签: ios swift uiappearance

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

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

有没有办法实现纯粹的Swift相同的东西?

1 个答案:

答案 0 :(得分:1)

我通过使用这样的结构解决了类方法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实际上都是绿色的)。