在我的应用程序中,我有一些界面元素,例如:CustomLabel, CustomView, CustomTextField
(所有自定义类都继承自其基类:UIView, UILabel, UITextField
。
此时我正在从每个元素DrawRect
回调调用一个函数,该函数在其自身上绘制下划线,基本上我在每个子类上都有重复的代码块。
如何在不创建DrawRect
extension
的情况下使这三个子类具有相同的UIView
内容,因为我不希望每个View
或subclass
{ {1}}有这种行为。
答案 0 :(得分:3)
为此,您可以使用协议和协议扩展将常用方法添加到子类中。然后,您只需要使您的类符合该协议并覆盖drawRect以从您的协议调用方法。不幸的是,通过仅符合协议而不进行任何其他更改来添加新行为是不可能的。您无法覆盖协议扩展中的方法,并且您无法添加使用Objective-C运行时的方法,这些方法可以允许方法调整。
在代码中,这看起来像这样:
protocol CustomDrawing {}
extension CustomDrawing where Self: UIView {
func myDrawingCode() {
// Whatever
}
}
你可以这样使用它:
class CustomLabel: UILabel, CustomDrawing {
override func draw(_ rect: CGRect) {
super.draw(rect)
myDrawingCode()
}
}
如果您需要访问myDrawingCode()
中的某些公共属性或方法,则必须在CustomDrawing协议中声明它们。 UIView方法是可用的,因为协议扩展被约束为UIView和子类型。