Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何基于集合视图中的单元格选择控制表视图的内容?_Swift_Uitableview_Uicollectionview - Fatal编程技术网

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

Swift 如何基于集合视图中的单元格选择控制表视图的内容?,swift,uitableview,uicollectionview,Swift,Uitableview,Uicollectionview,我有一个包含4个单元格的集合视图和一个位于同一视图控制器内的表视图。CV中的每个单元格必须使表格视图显示不同的列表;每个CV单元格一个表格单元格类型。当用户点击一个CV单元格时,表格必须重新加载其数据并显示正确类型的单元格(基本上是一个带有自定义单元格的不同列表)。每个列表只包含一个部分 我在表视图中创建并注册了所有不同的单元格,并准备好了所有数据,设置了视图等等。当用户点击另一个CV单元格时,如何使表格视图放弃其当前单元格(列表),并显示包含不同单元格的新列表? 我假设解决方案是在CV委托的d

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

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

我认为这应该很简单,只要在集合视图委托的
didSelectItemAt
方法的末尾调用
tableView.reloadData()

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
}

值的类型将是一个值得考虑的问题,以避免任何数组,这将不是超级类型安全的,但这将取决于对象的类型。

谢谢。当我第一次设置表视图的内容时,我想知道选择了集合视图的哪个单元格。因此,我可以从一开始就用正确的数组设置它。我将在section方法中的行数内使用switch语句。CV始终选择一个单元格;在创建第一个,然后是用户点击的任何内容。知道怎么做吗?不知道你是如何确定一个选中的状态的,但我会在实例化时将
selectedMenuTab
变量默认为0,然后让集合始终打开该变量