如何在 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回调中滚动到单元格?

从返回导航的单元格中删除观察者

在 UICollectionView 单元格中单击 WKWebView 会导致未调用回调

回调闭包函数在单元格中不起作用

如何快速在uicollectionview中动态访问单元格属性