子类UIButton保存数据?

时间:2017-09-04 19:15:39

标签: ios swift uibutton subclass

我想知道在扩展UIButton以获取我的数据的参考时是否有任何问题?

例如,我有一个表视图,每当用户点击一个单元格时,我需要向用户提供该特定单元格的数据。

数据保存在数组中,数组索引保存在UIButton标记中,但随着我的数组更新,将提供错误的索引。所以我试图做的是扩展一个uibutton然后有一个变量来保存我的模型。

这个想法很好但是因为我没有真正体验过swift,我想知道做这样的事情有什么缺点和问题。

1 个答案:

答案 0 :(得分:1)

您无需将index保存为Button的标记。将评论中指出的UIButton子类化为Sneak显然是一个非常糟糕的主意。最重要的是,在UIComponent中保存模型是灾难设计。

你可以采取多种方式。一个我觉得很整洁:

第1步:

为自定义单元格创建一个类。让我们说MyCollectionViewCell。因为您的Cell里面有一个按钮,所以您应该在Cell中创建IBAction按钮。

class MyCollectionViewCell: UICollectionViewCell {


    @IBAction func myButtonTapped(_ sender: Any) {

    }

}

第2步:

让我们声明一个协议,用于与tableView / CollectionView的dataSource进行通信。

protocol MyCollectionViewCellProtocol : NSObjectProtocol {
    func buttonTapped(for cell : MyCollectionViewCell)
}

第3步:

让我们在MyCollectionViewCell中创建一个属性

weak var delegate : MyCollectionViewCellProtocol? = nil

在第3步之后,您的MyCollectionViewCell类应该看起来像

protocol MyCollectionViewCellProtocol : NSObjectProtocol {
    func buttonTapped(for cell : MyCollectionViewCell)
}

class MyCollectionViewCell: UICollectionViewCell {

    weak var delegate : MyCollectionViewCellProtocol? = nil

    @IBAction func myButtonTapped(_ sender: Any) {
        self.delegate?.buttonTapped(for: self)
    }

}

第4步:

在tableView的CellForRowAtIndexPath或CollectionView的sizeForItemAtIndexPath中确认将ViewController传递为单元格的委托。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell : MyCollectionViewCell = //deque your cell
    (cell as! MyCollectionViewCell).delegate = self
}

第5步:

现在让ViewController确认协议

class YourViewController: UIViewController,MyCollectionViewCellProtocol {

第6步:

最后在VC中实现方法

func buttonTapped(for cell: MyCollectionViewCell) {
    let indexPath = self.collectionView?.indexPath(for: cell)
    //access array now
}

<强> P.S:

很抱歉虽然我知道你正在使用TableView,但我赶紧为CollectionView编写代码,但代表却非常相似:)我希望你能理解逻辑