ios - 向 UITextField、UILabel、UIView 自定义类添加自定义功能

标签 ios swift3

在我的应用程序中,我有一些界面元素,例如:CustomLabel、CustomView、CustomTextField(所有这些都是从它们的基类继承的自定义类:UIView、UILabel、UITextField。 此时此刻,我正在从每个元素 DrawRect 回调调用一个在其自身上绘制下划线的函数,基本上我在每个子类上都有大量重复的代码。 我怎样才能使这三个子类具有相同的 DrawRect 内容而不创建 UIViewextension 因为我不想要每个 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/

相关文章:

ios - 如何在 swift 3 中删除 Tabbar 项目

ios - 如何在 iOS 中制作供个人重用的框架(库?)?

ios - 重新加载 UICollectionView 部分并保留滚动位置

ios - 开启/关闭iCloud时迁移数据

swift - 如何在本地闭包中调用非转义闭包?

iOS 蓝牙服务建议

ios - UISegmentedControl 标签不适合

ios - 如何在 Swift3 iOS 中的特定持续时间内在 AVPlayer 中播放视频

ios - obj-c 无法从搜索数组中找到索引/错误输出

ios - 如何使 if 语句更改 xcode 中的文本字段?