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

时间:2017-01-22 09:25:34

标签: ios swift3

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

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和子类型。