gpt4 book ai didi

ios - UICollection 的 IndexPath 到底是什么

转载 作者:行者123 更新时间:2023-11-28 15:05:31 26 4
gpt4 key购买 nike

我在使用 UICollectionViews 时遇到了 2 个问题,我以某种方式相信它在这两种情况下都与 IndexPath 相关,但是我真的不知道 Indexpath 何时被调用或它究竟做了什么以及它何时被更新或更改。
无论如何,这是我的问题:1. Indexpath 多次为 0? Youtube VIDEO showing behavior

这里是这个特定行为的代码:

extension PointAllocVC: UICollectionViewDelegate, UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return (playerArray?.count)!
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "playerCell", for: indexPath) as! PointAllocCell
cell.cellDelegate = self
cell.cellIndex = indexPath.row
cell.nameLabel.text = playerArray![indexPath.row].alias
cell.scoreLabel.text = String(currentScore[indexPath.row])
cell.minusBtn.layer.cornerRadius = 15
cell.plusBtn.layer.cornerRadius = 15
cell.ptsRemaining = pointsToAllocate
cell.ptsUsed = abs(pointsUsedInCells[indexPath.row])
if indexPath.row == 0 {
cell.isSelf = true
cell.layer.borderWidth = 5
cell.layer.borderColor = UIColor.blue.cgColor
} else {
cell.isSelf = false
}
cell.updatedButtons()
return cell
}

如您所见,只有在 INDEXPATH.ROW == 0 单元格应该有边框(因为那是当前用户)。但是,当我单击按钮时(请参阅下面的按钮逻辑)突然它们都是索引路径 == 0?

class PointAllocCell: UICollectionViewCell {
var isSelf: Bool = false
var cellIndex: Int?
var ptsRemaining: Int = 0
var ptsUsed: Int = 0
var cellDelegate: PointsAllocDelegate?

@IBAction func plusTapped(_ sender: Any) {
if cellDelegate != nil {
cellDelegate!.plusTapReported(fromCell: cellIndex!)
}
updatedButtons()
}

@IBAction func minusTapped(_ sender: Any) {
if cellDelegate != nil {
cellDelegate!.minusTapReported(fromCell: cellIndex!)
}
updatedButtons()
}

func updatedButtons() {
switch (ptsRemaining, ptsUsed) {
case (0,0):
plusBtn.isEnabled = false
minusBtn.isEnabled = false
case (0,_):
if isSelf{
plusBtn.isEnabled = false
minusBtn.isEnabled = true
} else {
plusBtn.isEnabled = true
minusBtn.isEnabled = false
}
case (_,0):
if isSelf{
plusBtn.isEnabled = true
minusBtn.isEnabled = false
} else {
plusBtn.isEnabled = false
minusBtn.isEnabled = true
}
default:
plusBtn.isEnabled = true
minusBtn.isEnabled = true
}
pointLabel.text = String(ptsUsed)
}
}

最后是代表:

extension PointAllocVC: PointsAllocDelegate {
func plusTapReported(fromCell: Int) {
if fromCell == 0 {
//this is self
pointsToAllocate -= 1
pointsUsedInCells[fromCell] += 1
} else {
pointsToAllocate += 1
pointsUsedInCells[fromCell] += 1
}
reloadCollection()
reloadLabels()
}

func minusTapReported(fromCell: Int) {
if fromCell == 0 {
//this is self
pointsToAllocate += 1
pointsUsedInCells[fromCell] -= 1
} else {
pointsToAllocate -= 1
pointsUsedInCells[fromCell] -= 1
}
reloadCollection()
reloadLabels()
}
}

现在。第二个问题,当我执行以下操作时,我明白了

playerArray.remove(at: gKPlayerArray.index(of: playerDed)!)

这行代码没有做任何事情,但是在我调用“reloadData”之后我发现 IndexPath.row 超出范围(出于某种原因它仍然认为 playerArray 的大小为 X+1即使我在调用它之前删除了一个项目。

最佳答案

单元格永远不需要知道它自己的 indexPath。这是一个非常糟糕的设计。

重构您的代码,这样您就不会将行或索引路径传递给单元格。

更改您的单元格委托(delegate)协议(protocol)以传递实际单元格,而不是 Int

现在将告知实际实现委托(delegate)方法的类代表哪个单元格调用委托(delegate)方法,如果需要,该类可以确定单元格的 indexPath。

您还需要更新您的cellForItemAt

这段代码是一个问题:

    if indexPath.row == 0 {
cell.isSelf = true
cell.layer.borderWidth = 5
cell.layer.borderColor = UIColor.blue.cgColor
} else {
cell.isSelf = false
}

无论何时设置属性,都必须始终针对其他条件重置它。

    if indexPath.row == 0 {
cell.isSelf = true
cell.layer.borderWidth = 5
cell.layer.borderColor = UIColor.blue.cgColor
} else {
cell.isSelf = false
cell.layer.borderWidth = 0
}

您不需要为 0 宽度的边框重置颜色。

关于ios - UICollection 的 IndexPath 到底是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48526280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com