如何在其委托中引用特定单元格的数据?

时间:2019-06-27 01:28:59

标签: ios swift uicollectionview delegates

我只是从Swift中的代表开始。我有一个collectionView,其中将填充特定的单元格。用户可以按下每个单元格的“赞”按钮,每次按下都应在两个不同的心脏图像之间切换。我已经在单元类中设置了委托及其协议。我在保存单元格集合的视图控制器类中调用委托。如果不允许我引用特定单元格及其属性,应该如何更改特定单元格的“心形按钮”图像?谢谢!!

我显然曾尝试调用IB Action心形按钮图像变量,但是没有运气。我只需要将我的委托与以下功能合并:“ func collectionView(_ collectionView:UICollectionView,cellForItemAt indexPath:IndexPath)-> UICollectionViewCell”功能?当然,这的确允许您引用特定的单元格,但这似乎是错误的方法。

具有代理初始化功能的定制单元类:

 protocol EventCellDelegate: class {
func likeButtonPressed(toggle: Int)
}

class ProfileEventCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var likeCount: UILabel!
@IBOutlet weak var friendsGoing: UILabel!
@IBOutlet weak var friendGoingPic: UIImageView!
@IBOutlet weak var eventName: UILabel!
@IBOutlet weak var eventDate: UILabel!
@IBOutlet weak var eventTime: UILabel!
@IBOutlet weak var eventOrg: UILabel!
@IBOutlet weak var eventPic: UIImageView!
@IBOutlet weak var eventPrice: UIButton! // WHERE THE HEART IMAGE         GOES (bad name sorry)

weak var delegate: EventCellDelegate?
var likeToggle = 1
/*
let redHeart = UIImage(named: "likeheart")
let grayHeart = UIImage(named: "unlikeheart")
var likeToggle  = 1
var likeCountValue = 347
*/

@IBAction func eventPricePressed(_ sender: UIButton) {

    delegate?.likeButtonPressed(toggle: 1)
}
}

我的家庭视图控制器类别中的代理功能:

extension HomeViewController: EventCellDelegate {
func likeButtonPressed(toggle: Int) {
    //ProfileEventCollectionViewCell.eventPrice  <-- doesnt allow
        likeToggle = likeToggle + toggle          <-- doesnt find
        likeToggle
    if (likeToggle % 2 == 0) {
        eventPrice.setImage(redHeart, for: .normal)
        //likeCountValue = likeCountValue + 1
    } else {
        eventPrice.setImage(grayHeart, for: .normal)
        //likeCountValue = likeCountValue - 1

    }
}

}

实例成员'eventPrice'不能用于类型'ProfileEventCollectionViewCell'

使用未解决的标识符'likeToggle'

1 个答案:

答案 0 :(得分:0)

您的委托函数需要传递按下了like按钮的单元格:

protocol EventCellDelegate: class {
    func likeButtonPressed(in cell: ProfileEventCollectionViewCell)
}

然后您可以按以下方式调用委托函数:

@IBAction func eventPricePressed(_ sender: UIButton) {
    delegate?.likeButtonPressed(in:self)
}

您不需要传递toggle值-当点击按钮时,视图控制器可以决定需要执行的操作。

我不会直接在委托方法中更新单元格;更新数据模型,然后重新加载单元格-您的cellForItemAt:可以处理外观更新。

您对委托函数的实现将类似于:

func likeButtonPressed(in cell:ProfileEventCollectionViewCell) {

    guard let indexPath = self.collectionView.indexPath(for: cell) else {
        return
    }

    let myObject = myDataSource[indexPath.item]
    myObject.liked.toggle
    self.collectionView.reloadItems(at: [indexPath])
}