点击collection view cell按钮后如何间隔指定时间修改下一个cell图片
解决方案
前置准备
你需要先在当前ViewController中新增2个成员属性,用来记录状态和持有时钟,避免定时器被系统自动释放:
// 记录最后一次完成修改的cell索引 private var lastEditedIndexPath: IndexPath? // 持有自动切换定时器 private var autoChangeTimer: Timer? // 建议额外在数据源数组中新增对应记录cell图片状态的字段,避免cell复用出现显示异常,示例如下: // var cellImageStates: [String] = Array(repeating: "默认图名", count: 你的数据源数组长度)
修改现有点击方法逻辑
在你现有changeImage方法末尾添加定时器启动逻辑,随机生成20~30秒的触发间隔:
@objc func changeImage(sender: UIButton) { let buttonPosition = sender.convert(CGPoint.zero, to: self.tasksCollectionView) guard let index = self.tasksCollectionView.indexPathForItem(at: buttonPosition), let cell = self.tasksCollectionView.cellForItem(at: index) as? TasksDetailsCollectionViewCell else { return } // 同步修改数据源状态,避免滚动复用出现显示异常 // self.cellImageStates[index.item] = "greenCellImg" cell.backImage.image = UIImage(named: "greenCellImg") // 记录当前修改的索引 self.lastEditedIndexPath = index // 先销毁已存在的定时器,避免重复触发 self.autoChangeTimer?.invalidate() // 随机生成20-30秒的间隔 let interval = Double.random(in: 20...30) // 启动单次定时器 self.autoChangeTimer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(autoChangeNextCellImage), userInfo: nil, repeats: false) }
实现自动修改下一个cell的方法
@objc private func autoChangeNextCellImage() { guard let lastIndex = self.lastEditedIndexPath else { return } // 计算下一个cell的索引,默认collectionView只有1个section,多section可自行调整逻辑 let nextItem = lastIndex.item + 1 // 这里判断下一个索引是否超出数据源范围,如果需要循环修改可替换为 nextItem % 你的数据源数组长度 guard nextItem < 你的数据源数组.count else { // 已经到最后一个cell,销毁定时器即可 self.autoChangeTimer?.invalidate() self.autoChangeTimer = nil return } let nextIndexPath = IndexPath(item: nextItem, section: 0) guard let nextCell = self.tasksCollectionView.cellForItem(at: nextIndexPath) as? TasksDetailsCollectionViewCell else { return } // 修改下一个cell的图片,同步更新数据源 // self.cellImageStates[nextItem] = "greenCellImg" nextCell.backImage.image = UIImage(named: "greenCellImg") // 更新当前记录的索引 self.lastEditedIndexPath = nextIndexPath // 再次启动定时器,处理下一个cell let interval = Double.random(in: 20...30) self.autoChangeTimer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(autoChangeNextCellImage), userInfo: nil, repeats: false) }
注意事项
- 页面销毁时要主动销毁定时器,避免内存泄漏:
deinit { self.autoChangeTimer?.invalidate() self.autoChangeTimer = nil }
- 不要直接修改cell的控件属性,必须同步更新数据源中对应的状态,同时需要在
cellForItemAt代理方法中根据数据源的状态给cell的backImage赋值,否则collectionView滚动时cell复用会出现图片显示错乱的问题。
内容的提问来源于stack exchange,提问作者Taimoor Arif
相关产品推荐
相关产品推荐

