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

numberOfItemsInSection 的逻辑问题:

CustomTableCell 内的 UICollectionView

强制触摸 UITableViewCell 内的 UICollectionView