将自定义功能添加到UITextField,UILabel,UIView自定义类



在我的应用程序中,我有一些界面元素,例如:CustomLabel, CustomView, CustomTextField(所有这些都是从其基类继承的自定义类:UIView, UILabel, UITextField。此时,我从每个元素调用DrawRect回调到一个在自身上绘制下划线的函数,基本上我在每个子类上都有大量重复的代码。如何在不创建UIView extension的情况下使这三个子类具有相同的DrawRect内容,因为我不希望每个Viewsubclass UIView都有这种行为。

为此,

您可以使用协议和协议扩展将常用方法添加到子类中。然后,您只需使类符合该协议并覆盖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()中的某些公共属性或方法,则必须在 CustomDraw 协议中声明它们。UIView 方法可用,因为协议扩展仅限于 UIView 和子类型。

最新更新