为啥第一次滚动到另一个 UITableView 中的 UICollectionView 中的 UITableView 不加载数据?

Posted

技术标签:

【中文标题】为啥第一次滚动到另一个 UITableView 中的 UICollectionView 中的 UITableView 不加载数据?【英文标题】:Why does my UITableView within a UICollectionView within another UITableView doesn't load data when scrolled to it for the first time?为什么第一次滚动到另一个 UITableView 中的 UICollectionView 中的 UITableView 不加载数据? 【发布时间】:2019-04-10 02:37:35 【问题描述】:

我有一个UITableView,其中一个单元格包含一个UICollectionView。然后,UICollectionView 的每个单元格还包含一个UITableView。为了更清楚地说明这一点:

我第一次滚动到这个单元格时,没有加载任何内容,单元格的高度只是 0。当我继续滚动外部 UITableView 直到这个特定的单元格离开屏幕(被破坏)并回到那里时,然后加载数据。这是一个简化的代码sn-p:

class ViewController: UIViewController 
    @IBOutlet weak var outerTableView: UITableView!

    func tableView(..., cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        if indexPath.row == ... 
            // return regularCells
        

        let cellThatHasCollectionView: CustomTableViewCell = ...

        cellThatHasCollectionView.sectionData = ... // An array of array

        return cellThatHasCollectionView
    

特殊的UITableViewCell定义如下:

private class CustomTableViewCell: UITableViewCell 
    private let someCollectionView: UICollectionView = ...

    public var sectionData: [[SomeType]] = []

    init(...) 
        ...
        someCollectionView.delegate = self
        someCollectionView.dataSource = self
    

    func collectionView(..., numberOfItemsInSection section: Int) -> Int 
        return sectionData.count
    

    func collectionView(..., cellForItemAt indexPath: IndexPath) -> ... 
        let cell: CustomCollectionViewCell = ...
        cell.items = sectionData[indexPath.row]
        return cell
    

最后,我将这个内部UITableView定义如下:

private class CustomCollectionViewCell: UICollectionViewCell 
    public var items: [SomeType] = []

    private let innerTableView: UITableView = ...

    init(...) 
        ...
        innerTableView.delegate = self
        innerTableView.dataSource = self
    

    func tableView(..., numberOfItemsInSection section) -> Int 
        return items.count
    

    ...

我应该如何解决这个问题? :)

【问题讨论】:

【参考方案1】:
public var sectionData: [[SomeType]] = []
    didSet
        someCollectionView.reloadData()
    


public var items: [SomeType] = []
    didSet
        innerTableView.reloadData()
    

您应该创建一个标志变量来控制someCollectionViewinnerTableView,它们只是在您设置sectionDataitems 时第一次加载

【讨论】:

不幸的是,它没有用 :( 我在代码中创建了一些断点,例如 cellForRowAtcellForItemAt,第一次滚动到该单元格时,都没有调用出于某种原因。但感谢您的帮助!

以上是关于为啥第一次滚动到另一个 UITableView 中的 UICollectionView 中的 UITableView 不加载数据?的主要内容,如果未能解决你的问题,请参考以下文章

为啥UITableView回到前面时只显示一半的数据

为啥我的子类 UItableView 不滚动?

我的 UITableView 不会向下滚动到数据的末尾!为啥?

为啥 UITableView 只在输入第一个字符时自动滚动?

为啥我的 UITableView 单元格在滚动时重叠?

为啥 UITableView 滚动时会更新约束?