Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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
Ios 如何在tableview Swift中重新加载特定区域中的选定单元格以进行展开/折叠_Ios_Swift_Iphone_Uitableview_Expandablelistview - Fatal编程技术网

Ios 如何在tableview Swift中重新加载特定区域中的选定单元格以进行展开/折叠

Ios 如何在tableview Swift中重新加载特定区域中的选定单元格以进行展开/折叠,ios,swift,iphone,uitableview,expandablelistview,Ios,Swift,Iphone,Uitableview,Expandablelistview,我正在iOS应用程序中执行“展开/折叠tableview单元格”功能。我有多个部分。每个部分都有多个单元格。默认情况下,单元格高度为100,一旦用户点击单元格,我将把高度增加到200 所以,基于布尔值,我正在改变它。但是,在滚动tableview时,它在节之间交换展开/折叠单元格。 就像我点击第一部分的第一个单元格,它正在扩展,但在滚动tableview之后,第二部分的第一个单元格也在扩展 我的要求是,若用户点击特定单元格,该单元格只应展开/折叠。用户可以手动展开和关闭。用户可以展开多个单元格

我正在iOS应用程序中执行“展开/折叠tableview单元格”功能。我有多个部分。每个部分都有多个单元格。默认情况下,单元格高度为100,一旦用户点击单元格,我将把高度增加到200

所以,基于布尔值,我正在改变它。但是,在滚动tableview时,它在节之间交换展开/折叠单元格。 就像我点击第一部分的第一个单元格,它正在扩展,但在滚动tableview之后,第二部分的第一个单元格也在扩展

我的要求是,若用户点击特定单元格,该单元格只应展开/折叠。用户可以手动展开和关闭。用户可以展开多个单元格

因此,我尝试存储行和节

         var expandedIndexSet : IndexSet = []
             var expandedIndexSection : IndexSet = []
         
             func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                 let cell = tableView.dequeueReusableCell(withIdentifier:"cellIdentifier", for:
         indexPath) as! MyTableViewCell
         
if expandedIndexSet.contains(indexPath.row) && expandedIndexSection.contains(indexPath.section) { // expanded true
                     cell.height = 200
                    //some other data loading here
                 }
                 else {  //expanded false
              cell.height = 100
                 }
              }
         
             @IBAction moreButtonTapped(_ sender: Any) {
                 
                 if(expandedIndexSet.contains(indexPath.row)) && expandedIndexSection.contains(indexPath.section){
                     expandedIndexSet.remove(indexPath.row)
                     expandedIndexSection.remove(indexPath.section)
                     
                 } else {
                     expandedIndexSet.insert(indexPath.row)
                     expandedIndexSection.insert(indexPath.section)
                 }
                 entriesTableView.beginUpdates()
                 entriesTableView.reloadRows(at: [indexPath], with: .none)
                 entriesTableView.endUpdates()
             }

任何人都可以提供比这更好的方法?

如果将节和行分别存储在单独的数组中,则算法将失败。 原因是两者都是相互依赖的: 想象三个展开的单元格(行:1,节:1),(行:2,节:1),(行:3,节:2)

现在单元格(第3行,第1节)会发生什么情况? 行数组包含值“3”,节数组包含值“1”,因此它将被视为已展开

因此,您需要将索引路径作为一个整体存储—请参见示例代码:

var expanded:[IndexPath] = []

expanded.append(IndexPath(row:1, section:1))
expanded.append(IndexPath(row:2, section:1))
expanded.append(IndexPath(row:3, section:2))

let checkPath = IndexPath(row:3, section:1)
if (expanded.contains(checkPath)) {
    print ("is expanded")
} else {
    print ("collapsed")
}
更新 因此,在按钮手柄中,您将执行以下操作:

@IBAction moreButtonTapped(_ sender: Any) {
    
    if(expanded.contains(indexPath)) {
        expanded.removeAll { (checkPath) -> Bool in
            return checkPath == indexPath
        }
    } else {
        expanded.append(indexPath)
    }
    entriesTableView.beginUpdates()
    entriesTableView.reloadRows(at: [indexPath], with: .none)
    entriesTableView.endUpdates()
}

感谢@AndreasOetjen的宝贵建议,但在按钮操作中,我如何插入和删除扩展的indexpath?请检查我的更新答案-我不知道如何获得与按钮对应的索引路径,但您似乎以某种方式存储了它。谢谢,我从按钮标记获得了indexpath,这段代码运行良好,这是一种比我的代码更好的方法。谢谢@AndreasOetjen我接受了你的回答,并对这方面的任何建议投了赞成票,我必须显示全部打开/全部关闭