UITableViewCell indexPath错误中的Swift UICollectionView

Posted

技术标签:

【中文标题】UITableViewCell indexPath错误中的Swift UICollectionView【英文标题】:Swift UICollectionView in UITableViewCell indexPath error 【发布时间】:2017-01-12 22:09:47 【问题描述】:

我正在表格视图单元中实现一个集合视图单元,但是集合视图 indexPath 发生了奇怪的事情。

numberOfItemsinSection 被触发 3 次,然后 cellForItemAt 在 numberOfitemsInSection 为 2 时仅触发一次。我希望集合视图有一个部分和 2 个单元格。

这里是源数据:

[["myDomain.jpg1", "myDomain.jpg2"]]

以下是以下代码的控制台输出:

"number of items in section: 2"
"number of items in section: 2"
"number of items in section: 2"
"cell for item at [0, 0]"
"indexPath.section: 0"    
"indexPath.row: 0"    
"myDomain.jpg1"

这是我的视图控制器:

class WishListsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 

var tableView: UITableView = UITableView()

override func viewDidLoad() 
    super.viewDidLoad()

    tableView.delegate      =   self

    tableView.dataSource    =   self

    tableView.register(WishListsCell.self, forCellReuseIdentifier: cellId)

    self.view.addSubview(tableView)


func numberOfSections(in tableView: UITableView) -> Int 
    return wishLists.count // 1


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return 1


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

    let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! WishListsCell

    return cell

这是我的表格视图单元格:

class WishListsCell: UITableViewCell 

var collectionView: UICollectionView!

override init(style: UITableViewCellStyle, reuseIdentifier: String?) 
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    layout.itemSize = CGSize(width: screenWidth, height: (screenWidth / 4))
    layout.minimumInteritemSpacing = 0
    layout.minimumLineSpacing = 0
    layout.estimatedItemSize.height = (screenWidth / 4)
    layout.estimatedItemSize.width = screenWidth

    collectionView = UICollectionView(frame: contentView.frame, collectionViewLayout: layout)

    collectionView.delegate = self

    collectionView.dataSource = self

    collectionView.register(WishListsCollectionViewCell.self, forCellWithReuseIdentifier: cellId)

    self.contentView.addSubview(collectionView)



required init?(coder aDecoder: NSCoder) 
    fatalError("init(coder:) has not been implemented")
    


extension WishListsCell: UICollectionViewDelegateFlowLayout, UICollectionViewDataSource 

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 

    let items = wishListUrls[section]

    debugPrint("number of items in section: \(items.count)")

    return items.count


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

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! WishListsCollectionViewCell

    debugPrint("cell for item at \(indexPath)")

    debugPrint("indexPath.section: \(indexPath.section)")

    debugPrint("indexPath.row: \(indexPath.row)")

    if let imageUrl = wishListUrls[indexPath.section][indexPath.row] as String! 

        debugPrint(imageUrl)

【问题讨论】:

附带说明:这是一篇关于在 TableViewCell 中的 CollectionView 中可能遇到的陷阱的博客文章:ashfurrow.com/blog/… 在collectionview中你应该使用indexPath.item而不是indexPath.row 没什么区别。我的理解indexPath.rowindexPath.item是同义词,可以互换 【参考方案1】:

我在您的 WishListsCell 扩展中没有看到 numberOfSections(in collectionView) 的实现。

根据您发布的 sn-ps,我无法确定,但它可能看起来像。

func numberOfSections(in collectionView: UICollectionView) -> Int 
    return wishListUrls.count

【讨论】:

我确实实现了这个,它没有任何区别。我假设它默认为 1,我在许多代码示例中都看到它丢失了。 每个表格视图单元格应该有 1 个集合视图部分和多个单元格。 是的...抱歉,我帮不上忙。实现这一点所需的代码量使得在 SO 帖子中仅使用几个 sn-ps 就很难推理。看起来您将拥有大约 20 条 debugPrint 声明,然后才能确定这一声明。哈哈。我相信你会明白的。祝你好运。【参考方案2】:

最终,主要问题归结为从 5 个 Alamofire 请求中加载我的数据,因为我还没有从 API 的单个请求中获得详细信息。 tableView.reloadData() 似乎反复触发,直到我在第一次 Alamofire 完成中明确触发它。当我将详细数据伪造为本地字典时,它似乎工作得更好。

除此之外,我是这样实现的 Swift - how to open another viewcontroller with CollectionViewCell inside UITableViewCell

唯一的变化是我的表格单元格中有多个部分,每个部分都有一行,所以我让collectionView.tag 使用indexPath.section 而不是indexPath.row

我也用过https://ashfurrow.com/blog/putting-a-uicollectionview-in-a-uitableviewcell-in-swift/

还有这个

https://www.thorntech.com/2015/08/want-your-swift-app-to-scroll-in-two-directions-like-netflix-heres-how/

【讨论】:

以上是关于UITableViewCell indexPath错误中的Swift UICollectionView的主要内容,如果未能解决你的问题,请参考以下文章

给定 UITableViewCell 的 indexPath,加载该特定单元格

从 -tableView:cellForRowAtIndexPath: 计算“indexPath”处的自定义 UITableViewCell 高度:?

特定 UITableViewCell 的 indexPath 始终为 nil

UITableViewCell 怎么知道自己的 indexPath?

UITableViewCell 问题 indexPath.row 无法正确显示

按下按钮时在 UITableViewCell 中查找按钮的 indexPath?