如何基于集合视图中的单元格选择来控制表视图的内容?

时间:2019-08-11 19:48:03

标签: swift uitableview uicollectionview

我在同一视图控制器中有一个包含4个单元格的收集视图和一个表视图。简历中的每个单元格都必须使表格视图显示不同的列表;每个CV单元一种表单元类型。当用户点击一个CV单元格时,表格必须重新加载其数据并显示正确的单元格类型(基本上是带有自定义单元格的另一个列表)。每个列表仅包含1个部分。

我创建了所有不同的单元格并将其注册到表格视图中,并准备好了所有数据,设置了视图等等。当用户点击另一个CV单元格时,如何使表视图丢弃其当前单元格(列表)并显示具有不同单元格的新列表? 我想解决方案在CV委托的didSelectItem方法中,但是当用户更改了CV中的单元格选择时,我找不到任何信息显示如何使表出列不同的单元格。或根据需要丢弃前一个。 目前,我仅注册和出队一种类型的单元格,并且在CV的委托方法内部,我正在调用空函数,这些函数应该将新列表放入表中。 每个列表的行数是动态的,这意味着我将不得不再次在表视图上调用委托方法。 我已经找到了MVVM模式的示例,但由于它比较静态,因此无法将其应用于我的逻辑。
任何帮助将非常感激。谢谢。

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let selectedMenuTab = indexPath.item
        switch selectedMenuTab { // show different type of cell.
        case 0: showAList()
        case 1: showBList()
        case 2: showCList()
        case 3: showDList()
        default:
            print("no such main tab")
        }
    }


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableOfConversations.dequeueReusableCell(withIdentifier: rowID, for: indexPath) as! ConversationsListCell
        let messageInChatList = listOfOneToOneChats[indexPath.item]
        cell.messageInChatList = messageInChatList
        cell.selectionStyle = .none
        return cell
    }


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return listOfOneToOneChats.count
    }

1 个答案:

答案 0 :(得分:1)

我认为这应该像在集合视图委托的tableView.reloadData()方法末尾调用didSelectItemAt一样简单。

tableView应该具有基于公共数组的数据源,例如:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return displayingList.count
}

然后在集合视图的didSelect中设置该数组,然后告诉tableView重新加载:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let selectedMenuTab = indexPath.item
    switch selectedMenuTab { // show different type of cell.
    case 0: displayingList = listA
    case 1: displayingList = listB
    case 2: displayingList = listC
    case 3: displayingList = listD
    default:
        print("no such main tab")
    }
    tableView.reloadData()
}

对于使单元出队,请根据类型(如果不同)或基于selectedMenuTab进行检查:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell: UICollectionViewCell
    let selectedMenuTab = indexPath.item
    switch selectedMenuTab { // show different type of cell.
    case 0: cell = tableOfConversations.dequeueReusableCell(withIdentifier: rowID, for: indexPath) as! ConversationsListCell
    //And so on
    default:
        fatalError("No cell for this tab")
    }
    let item = displayingList[indexPath.item]
    // Cell setup
    return cell
}

为了避免使用Any数组,应该考虑值的类型,这不是超级类型安全的,但这取决于对象的类型。

相关问题