UICollectionView 内的 UITableView:无法设置值
Posted
技术标签:
【中文标题】UICollectionView 内的 UITableView:无法设置值【英文标题】:UITableView inside a UICollectionView: can't set value 【发布时间】:2019-12-11 21:30:34 【问题描述】:我有一个带有 4 个 UICollectionViewCells 的 UICollectionView。每个单元格都包含一个 UITableView,其中包含不同数量的单元格。
我有一个数组,我需要从中将一个值(取决于 indexPath)传递到单元格中。我的问题是,当我尝试这样做时,它总是给我 nil。
所以例如我有这个数组:
let arrayOfStrings = ["test1", "test2", "test3", "test4"]
我的集合视图的 cellForItemAt 方法中有这段代码:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "testCollectionViewCell", for: indexPath) as! TestCollectionViewCell
cell.myString = arrayOfStrings[indexPath.row]
cell.label.text = "This text is set."
return cell
单元格的标签设置正确,但是当我尝试在单元格的表格视图的 cellForRowAt 方法中打印 myString 时,它总是返回 nil。 我需要这个字符串,因为我打算根据传入的字符串来操作表格视图。
那么为什么会发生这种情况以及可以做些什么呢?
【问题讨论】:
你检查 indexPath.row 的值了吗? 【参考方案1】:你可以这样试试
extension HomeViewController : UITableViewDelegate, UITableViewDataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return 4
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
if indexPath.row == 0
let cell = tableView.dequeueReusableCell(withIdentifier: "DealTableViewCell", for: indexPath) as! DealTableViewCell
cell.DealCollectionView.dataSource = self
cell.DealCollectionView.delegate = self
cell.DealCollectionView.tag = 10101
return cell
else if indexPath.row == 1
let cell = tableView.dequeueReusableCell(withIdentifier: "BusinessTableViewCell", for: indexPath) as! BusinessTableViewCell
cell.BusinessCollectionView.dataSource = self
cell.BusinessCollectionView.delegate = self
cell.BusinessCollectionView.tag = 10102
return cell
else if indexPath.row == 2
let cell = tableView.dequeueReusableCell(withIdentifier: "FilterTableViewCell", for: indexPath) as! FilterTableViewCell
cell.FilterCollectionView.dataSource = self
cell.FilterCollectionView.delegate = self
cell.FilterCollectionView.tag = 10103
return cell
else
let cell = tableView.dequeueReusableCell(withIdentifier: "ComboTableViewCell", for: indexPath) as! ComboTableViewCell
cell.ComboCollectionView.dataSource = self
cell.ComboCollectionView.delegate = self
cell.ComboCollectionView.tag = 10104
return cell
将集合视图添加到每个tableview单元格并在tableview单元格中设置委托
extension HomeViewController : UICollectionViewDelegate, UICollectionViewDataSource
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
if collectionView.tag == 10101
return 3
else if collectionView.tag == 10102
return 3
else if collectionView.tag == 10103
return 3
else if collectionView.tag == 10104
return 3
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
if collectionView.tag == 10101
let cell = collectionView.dequeueReusableCell(withIdentifier: "DealCollectionViewCell", for: indexPath) as! DealCollectionViewCell
return cell
else if collectionView.tag == 10102
let cell = collectionView.dequeueReusableCell(withIdentifier: "BusinessCollectionViewCell", for: indexPath) as! BusinessCollectionViewCell
return cell
else if collectionView.tag == 10103
let cell = collectionView.dequeueReusableCell(withIdentifier: "FilterCollectionViewCell", for: indexPath) as! FilterCollectionViewCell
return cell
else if collectionView.tag == 10104
let cell = collectionView.dequeueReusableCell(withIdentifier: "ComboCollectionViewCell", for: indexPath) as! ComboCollectionViewCell
return cell
return UICollectionViewCell()
用于重新加载使用中的collectionView
if let cell = self.tableView.cellForRow(at: IndexPath(row: i, section: 0)) as?
tableViewCell
cell.collectionView.reloadData()
【讨论】:
但是像 UITableView 中的 UiCollectionView 一样使用 谢谢,问题是我将 CollectionViewCell 设置为委托和数据源,而不是 ViewController。改变这一点足以避免获得零。但是,现在我的问题是,对于第一个表视图,它会打印“test2”(它应该打印 test1)。当我在集合视图中滑动并返回到第一个单元格时,它现在会打印“test1”。 解决了!只需要在返回集合视图单元之前调用 cell.layoutIfNeeded()。以上是关于UICollectionView 内的 UITableView:无法设置值的主要内容,如果未能解决你的问题,请参考以下文章
检测位于另一个 uicollectionview 内的 uicollectionView 的哪个 UICollectionViewCell 位于中心
获取 UIScrollView 内的 UICollectionView 高度
ViewController 内的 UICollectionView