我想将一个Int64/32值从我的对象传递给一个按钮,以便它执行进一步的操作。但是btn.tag
取Int
的值,所以它给出了一个错误,如果我把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"。
-
我不建议在UI元素上传递值,你应该有模型对象。
-
我不建议使用"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)!) }
}
}