如何在 willDisplay 单元格回调中访问 UICollectionView 中的特定单元格
Posted
技术标签:
【中文标题】如何在 willDisplay 单元格回调中访问 UICollectionView 中的特定单元格【英文标题】:How to access specific cell in UICollectionView in willDisplay cell callback 【发布时间】:2018-09-05 18:17:37 【问题描述】:编辑:大图:我正在尝试像这样构建一个时间轴: 时间轴中的每个单元格代表一个月,所以 May 是水平 collectionView 中的最后一个单元格。我想要的是当 collectionView 加载时,如果它不可见,它会自动滚动到可能,然后调用单元格上的特定函数来绘制箭头。我用来尝试执行此操作的代码如下。
这是我的代码:
var onceOnlyCollectionView = false
var onceOnlyTimeline = false
internal func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath)
if collectionView == self.collectionView
if !onceOnlyCollectionView
let indexToScrollTo = IndexPath(row: self.posts.count - 1, section: 0)
collectionView.scrollToItem(at: indexToScrollTo, at: .left, animated: false)
onceOnlyCollectionView = true
else if collectionView == self.timeline
if !onceOnlyTimeline
let firstPost = posts.first?.timeStamp
let firstOfFirstMonth = firstPost?.startOfMonth()
let diff = posts.last?.timeStamp.months(from: firstOfFirstMonth!)
//self.currentPostMonth = diff
let monthCellIndexPath = IndexPath(row: diff!, section: 0)
timeline.scrollToItem(at: monthCellIndexPath, at: .centeredHorizontally, animated: false)
let months = self.posts.first?.timeStamp.startOfMonth().months(from: (self.posts.last?.timeStamp)!)
print("cells are",self.timeline.visibleCells)
if let optionalCell = timeline.cellForItem(at: IndexPath(row: months!, section: 0))
let cell = optionalCell as! TimelineMonthViewCell
let day = Calendar.current.component(.day, from: self.currentPostDate!)
cell.drawArrow(day: day)
else
print("cell out of range")
onceOnlyTimeline = true
现在,它确实成功滚动到可能,但是它打印“单元格是 []”和“单元格超出范围”并且没有绘制红色箭头。这里发生了什么,我如何访问这个新滚动的单元格?
【问题讨论】:
"我试图在它加载之前调用它。"这意味着什么?或许您应该从高层次上解释您正在尝试做什么,而不是寻求特定解决方案的帮助? @DuncanC 我对问题进行了大量编辑以包含更大的图景。如果这是您的想法,或者我是否应该添加更多内容,请告诉我 在willDisplay()
方法中使用 scrollToItem 似乎是个坏主意。我实际上从未使用过collectionView(_:willDisplay:forItemAt:)
,但从文档中,听起来该方法在创建单元格时被调用,但在它被添加到集合视图之前。因此,当屏幕上还没有单元格时调用它是完全合理的。在创建单元格并将其添加到集合视图时,它将被重复调用。试图在该方法内滚动必然会导致问题。相反,您应该在 viewDidLoad 方法中调用 scrollToItem()。
好的,我将代码放在 viewDidLoad 中,但仍然找不到那些单元格嗯
【参考方案1】:
您可以像这样简单地访问 Collection View 的特定单元格
override func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath)
if let cell = cell as? MyListingsCollectionViewCell
if isStuffAdded
//do something you want
【讨论】:
以上是关于如何在 willDisplay 单元格回调中访问 UICollectionView 中的特定单元格的主要内容,如果未能解决你的问题,请参考以下文章
具有动态高度的 UITableView 和 UITableViewCell 仅在 WillDisplay 中知道
如何在scrollViewDidScroll回调中滚动到单元格?