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.row
和indexPath.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?