在我的应用程序中,我有一些界面元素,例如:CustomLabel、CustomView、CustomTextField
(所有这些都是从它们的基类继承的自定义类:UIView、UILabel、UITextField
。
此时此刻,我正在从每个元素 DrawRect
回调调用一个在其自身上绘制下划线的函数,基本上我在每个子类上都有大量重复的代码。
我怎样才能使这三个子类具有相同的 DrawRect
内容而不创建 UIView
的 extension
因为我不想要每个 View
或UIView
的子类
以具有此行为。
最佳答案
为此,您可以使用一个协议(protocol)和一个协议(protocol)扩展来将您的常用方法添加到您的子类中。然后,您只需要让您的类符合该协议(protocol)并重写 drawRect 即可从您的协议(protocol)中调用方法。不幸的是,仅通过遵守协议(protocol)而不进行任何其他更改来添加新行为是不可能的。您不能覆盖协议(protocol)扩展中的方法,也不能添加使用 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()
中的某些公共(public)属性或方法,您必须在 CustomDrawing 协议(protocol)中声明它们。 UIView 方法可用,因为协议(protocol)扩展仅限于 UIView 和子类型。
关于ios - 向 UITextField、UILabel、UIView 自定义类添加自定义功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41789275/