gpt4 book ai didi

swift - 如何根据 Collection View 中的单元格选择来控制 TableView 的内容?

转载 作者:行者123 更新时间:2023-11-28 13:30:26 27 4
gpt4 key购买 nike

我在同一个 View Controller 中有一个包含 4 个单元格的 Collection View 和一个 TableView 。 CV 中的每个单元格必须使 TableView 显示不同的列表;每个 CV 单元格一个表格单元格类型。当用户点击一个 CV 单元格时,表格必须重新加载其数据并显示正确类型的单元格(基本上是带有自定义单元格的不同列表)。这些列表中的每一个仅包含 1 个部分。

我使用 TableView 创建并注册了所有不同的单元格,并准备好所有数据,设置了 View 等等。当用户点击另一个 CV 单元格时,如何使 TableView 丢弃其当前单元格(列表)并显示包含不同单元格的新列表?我想解决方案是在 CV 委托(delegate)的 didSelectItem 方法中,但是我找不到任何信息来说明当用户更改了 CV 中的单元格选择时如何使表出列不同类型的单元格;或在需要时丢弃前一个。目前,我只注册和出列一种类型的单元格,在 CV 的委托(delegate)方法中,我正在调用应该将新列表放入表中的空函数。每个列表的行数是动态的,这意味着我将不得不再次调用 TableView 的委托(delegate)方法。我找到了一个 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
}

最佳答案

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

tableView 应该有基于普通数组的数据源,例如:

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

然后在 Collection View 的 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 数组,需要考虑值的类型,这不是 super 类型安全的,但这取决于对象的类型。

关于swift - 如何根据 Collection View 中的单元格选择来控制 TableView 的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57453104/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com