ios - 在 didSelectItemAt 中,单元格的委托(delegate)为零

标签 ios swift uicollectionview delegates uicollectionviewcell

我有一个 UICollectionViewCell带有元素 Desk .办公 table 上有一个Bool点击单元格时我想要更改的属性。

我正在尝试更好地熟悉委托(delegate)模式,并希望避免使用覆盖在单元格上的透明按钮之类的东西。我认为在 cellForItemAt 中分配单元格的委托(delegate)会起作用。并触发 didSelectItemAt 中的委托(delegate)方法,但是当我 checkin didSelectItemAt 时,单元格的委托(delegate)为零.

结构:

struct Desk: Equatable, Codable {
    var name: String
    var wasTouched: Bool = false
}

协议(protocol):
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 符合 Protocol 并定义委托(delegate)方法:
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 中调用委托(delegate)方法并传入单元格,在委托(delegate)方法中单元格的 indexPath 为 nil

最佳答案

内部 didSelectItemAt代替

 guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as? DeskCell else {return}


guard let cell = collectionView.cellForItem(at: indexPath) as? DeskCell else {return}

当您使用 dequeueReusableCell cellForItemAt 之外它将返回与单击的单元格不同的单元格

关于ios - 在 didSelectItemAt 中,单元格的委托(delegate)为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59436789/

相关文章:

iphone - UISegmentedControl 部署在 iOS 5 和 iOS 5.1 上的不同行为

ios - 根据传递的参数调用另一个 ViewController 中的函数

ios - 每行 3 个项目的 UICollectionViewCell 大小

ios - iOS 设置包中的 TableView

ios - 为什么 subview Controller 会占据整个屏幕?

ios - UIScrollView 将按钮保持在固定位置

ios - UICollectionViewCell 没有填满 Swift 3 中的整个屏幕

Swift IAP 本地化价格

ios - 在 Collection View 中访问 indexPath

ios - CollectionView 单元格意外行为 swift