ios - swift/iOS : Collapsing a section in a UITableView

标签 ios swift uitableview

我有一个包含大约 5 个部分的 UITableView。我试图通过单击按钮来折叠和展开其中一个部分,但我看到一个问题,即我用来执行此操作的代码也会导致其他部分的折叠。具体来说,所有可见部分的第一行都被折叠了。

代码如下:

func didClickSectionCollapseButton() {
    shouldCollapseSection = !shouldCollapseSection
    tableView.beginUpdates()
    tableView.reloadSections(NSIndexSet(index: 1), withRowAnimation: .Fade)
    tableView.endUpdates()
}

这里是 numberOfRowInSection 方法:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    switch section {
    case 0:
        return 1
    case 1:
        // collapsible section
        return shouldCollapse ? 0 : collapsibleSectionCellCount
    case 2:
        return getCellCount()
    case 3:
        return 1
    case 4:
        return 1
    default:
        return 0
    }
}

这里有什么我遗漏的吗?我已经浏览了各种教程和问题,但我还没有找到解决方案。

最佳答案

您好,经过大量研究,我找到了一个使用 Storyboard 非常适合我的解决方案。

storyboard setup

查看 Controller 代码:

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var tblView: UITableView!

var sections = ["section1","section2","section3"]

var cells = ["cell1","cell2","cell3","cell4"]

var selectedIndx = -1

var thereIsCellTapped = false

override func viewDidLoad() {
    super.viewDidLoad()
    tblView.reloadData()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

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

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    switch section {
    case 0:
        return 2
    case 1:
        return 3
    default:
        return 4
    }
}

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 50
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if indexPath.section == selectedIndx && thereIsCellTapped{
        return 50
    }else{
        return 0
    }
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerCell = tableView.dequeueReusableCell(withIdentifier: "SectionTableViewCell") as! SectionTableViewCell
    headerCell.lblHeader.text = sections[section]
    headerCell.btnSelection.tag = section
    headerCell.btnSelection.addTarget(self, action: #selector(ViewController.btnSectionClick(sender:)), for: .touchUpInside)
    return headerCell
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "ExpandeTableViewCell") as! ExpandeTableViewCell
    cell.lblCell.text = cells[indexPath.row]
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print(indexPath.section)
}

@objc func btnSectionClick(sender:UIButton!){
    print("selected index",sender.tag)
    if selectedIndx != sender.tag {
        self.thereIsCellTapped = true
        self.selectedIndx = sender.tag
    }
    else {
        // there is no cell selected anymore
        self.thereIsCellTapped = false
        self.selectedIndx = -1
    }
    tblView.reloadData()
}
}

如果您不想在同一个选择上进行选择和取消选择,请参见下面的代码。

@objc func btnSectionClick(sender:UIButton!){
    print("selected index",sender.tag)

    selectedIndx = sender.tag

    tblView.reloadData()
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if indexPath.section == selectedIndx{
        return 50
    }else{
        return 0
    }
}

它对我有用,我引用了很多答案并成功了。希望对您有所帮助。

关于ios - swift/iOS : Collapsing a section in a UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38455245/

相关文章:

ios - 如何 : Self-Sizing Custom-View from XIB with StackView View in iOS

ios - 如何使用 Eureka 制作多行标签

ios - 本地化应用程序因 NSRangeException 而崩溃

objective-c - 在 Swift 中创建等效的 Objective-C Getter 和 Setter

ios - 如何根据 Swift 中元素的 id 从结构数组中删除结构元素?

ios - 抽屉 TableView : dismiss by pulling down

ios - UITableview contentoffset 有时不起作用

ios - Xcode 代码签名(失败)警告 : App Store rejected?

ios - 委托(delegate)按钮单击在 tableview 单元格中不起作用

ios - 使用 OpenCV matchTemplate 提高图像匹配精度