ios - 子类化/扩展 UIView,以便所有其他 View (UIImageView、UITextField ...)在创建时继承

标签 ios iphone uiview subclass extension-methods

当我想向 UIView 添加功能以便我的应用程序中的所有 View 都获得这些功能时,建议的方法是什么?事实上,我也需要添加一些存储的属性,因此无法进行扩展。由于我需要处理 Textfields、ImageViews、Views(谁知道还会有什么),我不想将每一个子类化,也不想添加该功能,所以目标是创建 UIView 和我所有控件的子类(如果可能的话)开箱即用该功能。

有了扩展会很容易,但正如我所说,我也需要存储一些东西,那么这个目标可以通过子类实现吗?或者什么是正确的方法(也许还有第三种选择)

谢谢

最佳答案

为什么不定义一个协议(protocol)并在协议(protocol)扩展中提供默认实现,然后让 UIView 符合该协议(protocol)?这是一个例子:

protocol MyProto {
    var someVar: Bool { get set }
    func someFunc() -> Void
}

extension MyProto {
    var someVar: Bool {
        get {
            // provide default implementation
            return true
        }
        set {

        }
    }

    func someFunc() -> Void {
        // provide common implementation
    }
}

extension UIView: MyProto {}

您还可以使用 where 子句来限制类型的默认行为。

extension MyProto where Self: UIControl {
    var someVar: Bool {
        get {
            return isUserInteractionEnabled
        }
        set {
            isUserInteractionEnabled = newValue
        }
    }
}

extension MyProto where Self: UITextField {
    var someVar: Bool {
        get {
            return isFirstResponder
        }
        set {
            newValue ? becomeFirstResponder() : resignFirstResponder()
        }
    }
}

关于ios - 子类化/扩展 UIView,以便所有其他 View (UIImageView、UITextField ...)在创建时继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44751659/

相关文章:

ios - UIButton 异常 : Unable to set title for a custom button type

ios - 带有复选标记的 MBProgressHUD 完成 View

ios - 将下载的图像从 url 设置为 Imageview - IoS

ios - 在没有自动布局的情况下增加 UIView 的高度

iphone - 将 UIView 的 subview 放在其 CALayer 前面?

swift - 在 Swift 中初始化 UIViews 的惯用模式

ios - 如何在 UIImage 中绘制具有此阴影效果的矩形?

ios - 如何以编程方式在 SceneKit 中围绕立方体包装 png 纹理

iphone - 从电子邮件重定向到移动浏览器,然后重定向到应用程序

iPhone 应用程序需要使用 ASIHTTPRequest 向 Joomla 进行身份验证