将自定义变量添加到UIButton等现有类的正确方法是什么?

Jac*_*ith 4 ios swift

在我的应用程序中,我严重依赖于不同的视图类型,它们将拥有不同的值.例如,对于一个按钮,我需要它有4个额外的变量,我实现它像这样:

import UIKit

class ActionButton: UIButton {

    var row = 0
    var action = 0
    var appDataId = ""
    var companyId = ""

}
Run Code Online (Sandbox Code Playgroud)

我使用ActionButton而不是UIButton.

但是,对于不同类型的视图,例如标签按钮等,我需要很多这些,这可能会使项目复杂化.

我的问题是,这是一个好的做法吗?有没有其他方法可以达到相同的效果?

谢谢!

Cod*_*000 7

方法0:你已经向我们展示的工作正常:D

那就是:继承现有的类并使用你的vars进行自定义.您只需复制粘贴该按钮或将新创建的按钮类设置为ActionButton.

但在我看来,有更多有趣的解决方案.


方法1:创建UIButton扩展并使用关联对象代替存储的变量.

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html

还有另一种方式:

扩展名可能不包含存储的属性


方法1.5(推荐的解决方案):

做一个扩展UIView.UILabel和UIButton以及许多其他UI元素都继承自它.您UIView继承的所有类都可以访问您在扩展中添加的内容UIView.


奖励方法(如果您想要或需要更进一步):创建自定义UIButton类并使用IBInspectables!

然后,您将能够直接从"界面"构建器修改变量,这非常便于测试!

例:

//
//  CustomButton.swift


import UIKit

@IBDesignable
class CustomButton: UIButton {

    @IBInspectable var cornerRadius: CGFloat = 3.0 {
        didSet {
            setupView()
        }
    }

    @IBInspectable var fontColor: UIColor = UIColor.whiteColor() {
        didSet {
            self.tintColor = fontColor
        }
    }

    override func awakeFromNib() {
        setupView()
    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        setupView()
    }

    func setupView() {
        self.layer.cornerRadius = cornerRadius

    }
Run Code Online (Sandbox Code Playgroud)