[英]Cell's delegate is nil in didSelectItemAt
我有一個帶有項Desk
的UICollectionViewCell
。 Desk 有一個Bool
屬性,我想在點擊單元格時更改該屬性。
我試圖更好地熟悉委托模式,並希望避免使用諸如覆蓋在單元格上的透明按鈕之類的東西。 我認為在cellForItemAt
分配單元格的委托並在didSelectItemAt
觸發委托方法是didSelectItemAt
,但是當我簽入didSelectItemAt
時,單元格的委托為零。
結構:
struct Desk: Equatable, Codable {
var name: String
var wasTouched: Bool = false
}
協議:
protocol TouchTheDesk: AnyObject {
func youTouchedIt(cell: DeskCell)
}
細胞:
import UIKit
class DeskCell: UICollectionViewCell {
@IBOutlet weak var deskLbl: UILabel!
weak var delegate: TouchTheDesk?
var desk: Desk? {
didSet {
updateViews()
}
}
func updateViews() {
self.deskLbl.text = desk?.name
}
}
使 VC 符合協議並定義委托方法:
extension NotAShoppingListVC: TouchTheDesk {
func youTouchedIt(cell: DeskCell) {
if cell.desk?.wasTouched != nil {
cell.desk!.wasTouched = !cell.desk!.wasTouched
} else {
cell.desk!.wasTouched = true
}
collectionView.reloadData()
}
}
cellForItemAt:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as? DeskCell else {return UICollectionViewCell()}
cell.desk = deskDealer.desks[indexPath.item]
if cell.desk!.wasTouched { //assigned on line above
cell.backgroundColor = .red
} else {
cell.backgroundColor = .green
}
cell.delegate = self
return cell
}
didSelectItemAt:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as? DeskCell else {return}
#warning("delegate is nil")
cell.delegate?.youTouchedIt(cell: cell)
}
編輯:如果我直接在didSelectItemAt
調用委托方法並傳入單元格,則該單元格的 indexPath 在委托方法中為零
里面didSelectItemAt
Replace
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as? DeskCell else {return}
和
guard let cell = collectionView.cellForItem(at: indexPath) as? DeskCell else {return}
當您在cellForItemAt
之外使用dequeueReusableCell
時,它將返回一個不同於點擊的單元格
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.