如何通过UIButton Swift

时间:2016-08-08 20:45:35

标签: ios swift uiview uibutton

我想将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的信息

2 个答案:

答案 0 :(得分:2)

查看控件并不意味着保存数据。

您可以使用button标记作为数据数组的索引。 (我在数组索引中添加一个常量值,以便只有某个范围内的非零标记引用数组中的条目。(说按钮标记从100开始。你从标签号中减去100)并且使用THAT作为数组索引。)在保留MVC设计模式方面,这可能是最简洁的方法。然后你可以拥有一个具有你需要的任何属性的结构数组。

您可以子类化UIButton,并根据@NSGangster的建议将Int64属性添加到子类。

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

答案 1 :(得分:1)

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

  2. 我不建议使用"标签"财产,因为我太通用了。你永远不会知道巫婆框架将使用和更改相同的标签值。

  3. 但如果必须,请使用子类,这样就可以使用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)!) }
        }
    }