我需要为输入表单创建一个可折叠的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也可以)
提前感谢您的帮助。
答案 0 :(得分:1)
章节标题可以点击(添加按钮USE ViewForHeader委托方法)并从故事板中创建一个单元格(故事板中的设计)并获取名称,姓名,城市等的出口并根据部分更改标题(在CellForRow中)并重复使用具有不同标签的所有部分的单元格 最后单击节标题更改行高(使行高度动态获取变量)关闭并打开。
答案 1 :(得分:0)
我通过稍微改变主意来解决它,将字段添加到stackviews
中,并且在点击stackView
的第一个元素button
时,我将元素隐藏在其中stackView
的其余部分将以这种方式崩溃。
for n in 1...myStackView.arrangedSubviews.count - 1{
myStackView.arrangedSubviews[n].isHidden = true
}