如何通过UIButton Swift传递Int64/Int32值



我想将一个Int64/32值从我的对象传递给一个按钮,以便它执行进一步的操作。但是btn.tagInt的值,所以它给出了一个错误,如果我把obj.id改为Int,那么它只从数字中取前几个数字。

cellBtn = UIButton(frame: CGRect(x: 150, y: 30, width: 100, height: 100))
        cellBtn.backgroundColor = .greenColor()
        cellBtn.setTitle("Test", forState: .Normal)
    //obj.id is Int64 value
        cellBtn.tag = obj.id
        cellBtn.addTarget(self, action: #selector(btnU), forControlEvents: .TouchUpInside)
        cell?.addSubview(cellBtn)
        return cell!
    func btnU(sender: UIButton!) {
        print("hey")
        print(sender.tag)
    }

我如何从cellBtn to btnU传递obj.id,以便btnU有来自obj.id的信息

视图控件并不是用来保存数据的。

可以使用按钮标记作为数据数组的索引。(我会为数组索引添加一个常量值,以便只有在一定范围内的非零标记才能引用数组中的条目。(假设按钮标签从100开始。您可以从标签编号中减去100,并将其用作数组索引。)就保留MVC设计模式而言,这可能是最干净的方式。然后你就可以有一个数组的结构体与任何你需要的属性。

你可以创建UIButton的子类,并在子类中添加一个Int64属性,如@NSGangster所建议的。

您可以使用关联存储将一个新对象附加到按钮实例,但这有点"hack"。

  1. 我不建议在UI元素上传递值,你应该有模型对象。

  2. 我不建议使用"tag"属性,因为它太通用了。你永远不知道哪个框架会使用和修改与你相同的标签值。

但如果你必须,使用子类,这样你就可以使用Int64:

class ByButton: UIButton {
    var myValue: Int64 = 0
}

或者你可以添加运行时属性到所有的uibutton(这是不推荐从第一个解决方案,因为它很难找到,并将添加到所有的uibutton在你的应用程序)

private var buttonValue: Int64 = 0
extension UIButton {
    var keyBoardHeight: CGFloat {
        get {
            return objc_getAssociatedObject(self, &buttonValue) as! CGFloat
        }
        set { objc_setAssociatedObject(self, &buttonValue, newValue,  objc_AssociationPolicy(rawValue: 0)!) }
    }
}

最新更新