Ios TableView在Swift中展开和折叠单元格

Ios TableView在Swift中展开和折叠单元格,ios,swift,uitableview,Ios,Swift,Uitableview,您好,我已经看过一个关于这个问题的教程,我可以在我的表视图中打开和关闭点击的部分,但是如果一个部分是打开的,我要打开另一个部分,我想关闭前一个部分,但我不能 表格视图代码 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let section = sections[section] if section.isOpened {

您好,我已经看过一个关于这个问题的教程,我可以在我的表视图中打开和关闭点击的部分,但是如果一个部分是打开的,我要打开另一个部分,我想关闭前一个部分,但我不能

表格视图代码

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    
    let section = sections[section]
    
    if section.isOpened {
        return section.options.count + 1
    } else {
        return 1
    }
}

func numberOfSections(in tableView: UITableView) -> Int {
    
    return sections.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    if indexPath.row == 0 {
        
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "headerCell", for: indexPath) as? HeaderView else {return UITableViewCell()}
        cell.backgroundColor = #colorLiteral(red: 0.9607108235, green: 0.9608257413, blue: 0.9606716037, alpha: 1)
        
        cell.titleLabel?.text = sections[indexPath.section].title
        return cell
        
    } else {
        
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as? CustomTableViewCell else {return UITableViewCell()}
        cell.backgroundColor = #colorLiteral(red: 0.9607108235, green: 0.9608257413, blue: 0.9606716037, alpha: 1)
        
        cell.titleLabel?.text = sections[indexPath.section].options[indexPath.row - 1]
        return cell
    }
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {  
    tableView.deselectRow(at: indexPath, animated: true)
    sections[indexPath.section].isOpened = !sections[indexPath.section].isOpened
    tableView.reloadSections([indexPath.section], with: .none)
}
剖面模型

class Section {
    
    let title: String
    let options: [String]
    var isOpened: Bool = false
    
    init(title: String, options: [String], isOpened: Bool = false) {
        
        self.title = title
        self.options = options
        self.isOpened = isOpened
    }
}
ViewDidLoad

sections = [
    
    Section(title: "Spor Giyim 1", options: [1,2,3].compactMap({ return "Cell \($0)" }), isOpened: true),
    Section(title: "Spor Giyim 2", options: [1,2,3].compactMap({ return "Cell \($0)" }), isOpened: false),
    Section(title: "Spor Giyim 3", options: [1,2,3].compactMap({ return "Cell \($0)" }), isOpened: false),
    Section(title: "Spor Giyim 4", options: [1,2,3].compactMap({ return "Cell \($0)" }), isOpened: false)
    
]

您需要将它们全部重置为
false
,然后切换单击部分的当前状态

let toSet = !sections[indexPath.section].isOpened
sections.forEach {
    $0.isOpened = false
}
sections[indexPath.section].isOpened = toSet
tableView.reloadData()

在viewController中存储对任何打开分区的引用,使用此选项将其重置为关闭,然后重新加载该分区和要打开的分区:

class myVC: UIViewController {
  var openSection: Int?
  // rest of the VC...
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {  
    tableView.deselectRow(at: indexPath, animated: true)
    if let openSection = openSection, openSection != indexpath.section {
       section[openSection].isOpened = false
       section[indexPath.section].isOpened = true
       tableView.reloadSections([ openSection, indexPath.section], with: .automatic)
       openSection = indexPath.section
    } else {
      sections[indexPath.section].isOpened.toggle()
      tableView.reloadSections([indexPath.section], with: .automatic)
      openSection = sections[indexPath.section].isOpened ? indexPath.section : nil
    }
}

用你的代码替换了我的Didselect函数,它成功了,谢谢,但我如何用动画实现这一点。我使用tableView.reloadSections([indexPath.section],带:。无),但应用程序已崩溃@Sh_Khan感谢你的回答@Sh_Khans的回答实际上解决了我的问题,但没有动画。我需要动画。上面将提供标准的表视图动画(正如@Sh_Khans一样,取决于您如何实现它)。您还可以(如果您是IOS 13+)使用同样具有动画效果的可扩散数据源API。如果你想要自定义动画,那是一个完全不同的问题。哦,谢谢你,我的ios目标是10.0,但我不知怎么解决了动画问题