使用UITableView Swift 3的可折叠输入表单

时间:2017-08-09 06:59:42

标签: ios uitableview swift3

我需要为输入表单创建一个可折叠的tableView,我已经搜索了很多,两天我正在尝试不同的代码,但它们不符合我的需要,我不知道如何将它们更改为我想要的是。我找到了几个例子,但它们只是用于显示一组对象。我需要的是一个像这张图片的表单,但不是用一个字符串数组填充单元格(就像我发现的那么多教程),而是制作与此屏幕截图完全相同的东西但是可折叠,以便当我点击时Personal info它崩溃了。

这是我在网上找到的代码之一,但正如我所说,我不想用Array填充它。我只是希望用不同的单元格添加尽可能多的Sections,并简单地使它们可折叠。

(顺便说一下,这段代码我的部分显示已折叠,但是当我点击每个应用程序崩溃时)

  

TestVC.swift

class TestVC: UITableViewController, ExpandableHeaderViewDelegate {

var sections = [
    Section(genre: "Animation", expanded: false),
    Section(genre: "Horror", expanded: false)
]

override func viewDidLoad() {
    super.viewDidLoad()

}


// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return sections.count
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return 4
}

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

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if (sections[indexPath.section].expanded){
        return 44
    } else{
        return 0
    }
}


// Just to make it look nice
override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return 2
}

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let header = ExpandableHeaderView()
    header.customInit(title: sections[section].genre, section: section, delegate: self)
    return header
}

func toggleSection(header: ExpandableHeaderView, section: Int) {
    sections[section].expanded = !sections[section].expanded

    tableView.beginUpdates()
    for i in 0..<6 {
        tableView.reloadRows(at: [IndexPath(row: i, section: section)], with: .automatic)
    }
    tableView.endUpdates()
}


}
  

ExpandableHeaderView.swift

protocol ExpandableHeaderViewDelegate {
    func toggleSection(header: ExpandableHeaderView, section: Int)
}

class ExpandableHeaderView: UITableViewHeaderFooterView {

var delegate: ExpandableHeaderViewDelegate?
var section: Int!

override init(reuseIdentifier: String?){
    super.init(reuseIdentifier: reuseIdentifier)
    self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(selectHeaderAction)))
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

func selectHeaderAction(gestureRecognizer: UITapGestureRecognizer){
    let cell = gestureRecognizer.view as! ExpandableHeaderView
    delegate?.toggleSection(header: self, section: cell.section)
}

func customInit(title: String, section: Int, delegate: ExpandableHeaderViewDelegate){
    self.textLabel?.text = title
    self.section = section
    self.delegate = delegate
}

override func layoutSubviews() {
    super.layoutSubviews()
    self.textLabel?.textColor = UIColor.white
    self.contentView.backgroundColor = UIColor.darkGray
}



 }

(如果还有其他方法,那么使用TableView也可以)

提前感谢您的帮助。

this

2 个答案:

答案 0 :(得分:1)

章节标题可以点击(添加按钮USE ViewForHeader委托方法)并从故事板中创建一个单元格(故事板中的设计)并获取名称,姓名,城市等的出口并根据部分更改标题(在CellForRow中)并重复使用具有不同标签的所有部分的单元格 最后单击节标题更改行高(使行高度动态获取变量)关闭并打开。

答案 1 :(得分:0)

我通过稍微改变主意来解决它,将字段添加到stackviews中,并且在点击stackView的第一个元素button时,我将元素隐藏在其中stackView的其余部分将以这种方式崩溃。

for n in 1...myStackView.arrangedSubviews.count - 1{
    myStackView.arrangedSubviews[n].isHidden = true
}