我只是从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'
答案 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])
}