我想知道在扩展UIButton以获取我的数据的参考时是否有任何问题?
例如,我有一个表视图,每当用户点击一个单元格时,我需要向用户提供该特定单元格的数据。
数据保存在数组中,数组索引保存在UIButton标记中,但随着我的数组更新,将提供错误的索引。所以我试图做的是扩展一个uibutton然后有一个变量来保存我的模型。
这个想法很好但是因为我没有真正体验过swift,我想知道做这样的事情有什么缺点和问题。
答案 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编写代码,但代表却非常相似:)我希望你能理解逻辑