当前位置: 首页 > 面试题库 >

CollectionView单元格中处于正常状态的UIButton图像每四个单元格重复一次

屠君墨
2023-03-14
问题内容

我正在尝试为位于collectionView单元中的按钮的正常状态设置图像。当按下按钮时,图像改变。问题在于,每四个单元格在按下按钮时会重复与原始单元格相同的图像。有没有办法让它自己重复一次?当按下按钮时,它仅适用于该单个单元格吗?

这是代码

class FavoritesCell: UICollectionViewCell {

  var isFavorite: Bool = false

  @IBOutlet weak var favoritesButton: UIButton!

  @IBAction func favoritesButtonPressed(_ sender: UIButton) {
        _ = self.isFavorite ? (self.isFavorite = false, self.favoritesButton.setImage(UIImage(named: "favUnselected"), for: .normal)) : (self.isFavorite = true, self.favoritesButton.setImage(UIImage(named: "favSelected"), for: .selected))

    }
}

我尝试这样做,但由于某些奇怪的原因,即使按下按钮,也不会显示“选定”状态图像:

let button = UIButton()

override func awakeFromNib() {
    super.awakeFromNib()

    button.setImage(UIImage(named: "favUnselected"), for: .normal)
    button.setImage(UIImage(named: "favSelected"), for: .selected)
}

问题答案:

每次您的单元 出队时 cellForItemAt都会调用。在此配置单元数据。因此,如果需要显示标记为收藏夹的单元格,则可以在此处进行。

那么,你在那里怎么做?假设您一开始没有选择所有单元格。精细。您不必在中说什么cellForItemAt。现在,假设您将几个单元格标记为收藏。这里发生的是,当单元格可见时,它将反映更改,因为按钮已钩到将进行更改的选择器上。

现在这是问题所在。当您 滚动
并且该单元格消失时,关于您的单元格被标记为收藏夹的信息将会丢失!因此,您需要做的是维护一个数组,该数组将存储IndexPath所有选定单元格的。(确保IndexPath从收藏夹中删除单元格时删除!)我们将该数组称为favourites。如果您可以将数据源用于收集视图来存储选定的状态信息,那也很好。现在,您必须在按钮选择器中存储有关您的单元是否被标记为收藏夹的信息。

@objc func buttonTapped() {
    if favourites.contains(indexPath) {   // Assuming you store indexPath in cell or get it from superview
        favourites.removeAll(where: {$0 == indexPath})
    } else {
        favourites.append(indexPath)
    }
}

存储有关单元格的信息后,每次使单元格出队时,都需要检查IndexPathis
是否为favourites。如果是,则调用将单元格设置为选定状态的方法。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    // Dequeue cell and populating cell with data, etc
    if favourites.contains(indexPath) {
        cell.showFavourite()
    }
}

做完了吗 没有!现在我们还有另一个问题。此问题与单元的 重用 有关。那么cellForItemAt实际上发生了什么?您使单元 出队
并使用它显示信息。因此,当您将其出队时,所发生的是,它可能已被用于在其他索引路径中显示其他信息。因此,在那里 存在的 所有数据都将 保留
。(这就是为什么您的收藏夹每4个单元重复一次的问题!)

那么我们该如何解决呢?在单元出队 之前, 有一种方法UICollectionViewCell被调用-
。您需要在单元格中实现此方法,并从单元格中删除所有信息,以使它到达时是新鲜的。 __prepareCellForReuse``cellForItemAt

func prepareForReuse() {
     //Remove label text, images, button selected state, etc
}

或者,您可以始终在其中设置单元格中所有内容的每个值,cellForItemAt以便始终用必要的值覆盖每个信息。

编辑:OP说他在集合视图中有一个集合视图。您可以确定这样调用哪个集合视图,

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    if collectionView === favoriteCollectionView { // This is the collection view which contains the cell which needs to be marked as favourite
        // Dequeue cell and populating cell with data, etc
        if favourites.contains(indexPath) {
            cell.showFavourite()
        }
        return cell
    }
    // Dequeue and return for the other collectionview
}


 类似资料:
  • 问题内容: 我正在尝试为在表格视图单元格中按下的按钮运行一个动作。下面的代码在我的表视图控制器类中。 在我的UITableViewCell类的称为requestCell的插座中,该按钮已被描述为“是”。 我正在使用“解析”来保存数据,并且想在按下按钮时更新对象。我的objectIds数组可以正常工作,cell.yes.tag还会在日志中输出正确的数字,但是,为了正常运行查询,我无法将该数字输入“连

  • 问题内容: 我正在将AutoSizing单元格与Autolayout和UICollectionView一起使用。 我可以在单元初始化的代码中指定约束: 但是,由于该单元尚未添加到中,该应用程序崩溃了。 问题 在该阶段的生命周期,可以添加一个约束的? 有没有作出任何默认方式的equal to the of thewithout accessing an instance of or? 编辑 这个问题

  • 即使我指定了工作表“source”和“destination”,如果我不从工作表“source”运行该宏,它将返回一个错误。我认为问题出在“for Each c In selection”这一行上,但它指出上面的行是有问题的。我不知道这有什么问题。

  • 我需要显示一组具有不同高度的collectionViewCells。视图太复杂,我不想手动计算预期的高度。我想强制自动布局来计算单元格高度 在之外调用会破坏ColltionView并导致其崩溃 另一个问题是单元格不在单独的xib中,所以我无法手动实例化临时单元格并将其用于高度计算。 对此有什么解决办法吗? 编辑: 一旦被调用,就会发生崩溃。如果我不调用该方法并返回大小,则一切正常,单元格显示为没有

  • 我有一个servlet,它接收一组数据,进行处理,并根据表单提交将其写入excel文件或文本页面。在处理Excel时,所有的处理都在使用Apache POI的相应模型中进行。我正在尝试修改它,以便它根据所包含的数据对行进行颜色编码,但是,在将颜色应用于行之后,当我将工作簿写入文件输出流时,颜色不存在。我正在将数据处理成excel文件,如下所示: MCVE公司 我仍然得到excel文件,但格式不存在

  • 我的excel工作表中有两个单元格,其中一个单元格包含如下字符串: 而另一个单元格有欧元货币,例如: 现在我想复制这两个值,即“总额”和“223.463.687€”,并将其复制到第三个单元格中。我使用的公式是这样的: 我得到以下结果: 但是我应该: 注: 货币的格式是德语格式,意思是“.”(小数点)和“,”(昏迷)扮演相反的角色。在德语格式中,“,”是小数点,在英语中是“。”。