Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 向现有类(如UIButton)添加自定义变量的正确方法是什么?_Ios_Swift - Fatal编程技术网

Ios 向现有类(如UIButton)添加自定义变量的正确方法是什么?

Ios 向现有类(如UIButton)添加自定义变量的正确方法是什么?,ios,swift,Ios,Swift,在我的应用程序中,我严重依赖于不同的视图类型,它们将持有不同的值。例如,对于一个按钮,我需要它有4个额外的变量,我这样实现它: import UIKit class ActionButton: UIButton { var row = 0 var action = 0 var appDataId = "" var companyId = "" } 我用了一个ActionButton而不是UIButton 然而,我需要很多这些不同类型的视图,如标签按钮等,这

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

import UIKit

class ActionButton: UIButton {

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

}
我用了一个ActionButton而不是UIButton

然而,我需要很多这些不同类型的视图,如标签按钮等,这可能会使项目复杂化

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


谢谢

方法0:您已经展示给我们的效果很好:D

这就是:对现有类进行子类化,并使用VAR对其进行自定义。您只需复制粘贴该按钮或将新创建的按钮类设置为
ActionButton

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


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

还有另一种方法:


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

扩展
UIView
。UILabel和UIButton以及许多其他UI元素都继承自它。从
UIView
继承的所有类都可以访问您在
UIView
扩展中放置的内容


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

然后,您将能够直接从Interface builder修改变量,这对于测试非常方便

例如:

//
//  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

    }

@Desdenova,您不能在扩展中添加存储的属性,因此这一个词对提问者没有帮助。我想你应该澄清方法1是关于创建一个从UIButton继承的自定义类,OP从来没有问过是否可以直接从界面生成器编辑这些值。回答得很好。问题是关于添加存储属性的,不是吗?@werediver-yes!这一切都是关于回答和提供附加值。我将把重点从
IBInspectable
转移到子类化,作为添加存储属性的一种方式(顺便说一句,这可以或不能满足提问者,取决于子类化是否适合他的情况)。@werediver我目前正在改进我的答案!谢谢你的反馈。