我想将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)
}
如何从obj.id
传递cellBtn to btnU
,以便btnU拥有来自obj.id
的信息
答案 0 :(得分:2)
查看控件并不意味着保存数据。
您可以使用button标记作为数据数组的索引。 (我在数组索引中添加一个常量值,以便只有某个范围内的非零标记引用数组中的条目。(说按钮标记从100开始。你从标签号中减去100)并且使用THAT作为数组索引。)在保留MVC设计模式方面,这可能是最简洁的方法。然后你可以拥有一个具有你需要的任何属性的结构数组。
您可以子类化UIButton,并根据@NSGangster的建议将Int64属性添加到子类。
您可以使用关联存储将新对象附加到按钮实例,但这有点" hack-ish"。
答案 1 :(得分:1)
我不建议在UI元素上传递值,你应该有这个目的的模型对象。
我不建议使用"标签"财产,因为我太通用了。你永远不会知道巫婆框架将使用和更改相同的标签值。
但如果必须,请使用子类,这样就可以使用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)!) }
}
}