簡體   English   中英

單元格的委托在 didSelectItemAt 中為零

[英]Cell's delegate is nil in didSelectItemAt

我有一個帶有項DeskUICollectionViewCell 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM