UITableView Swift 3 的可折叠输入表单

Posted

技术标签:

【中文标题】UITableView Swift 3 的可折叠输入表单【英文标题】:Collapsible input form with UITableView Swift 3 【发布时间】:2017-08-09 06:59:41 【问题描述】:

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

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

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

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 也可以)

提前感谢您的帮助。

【问题讨论】:

您可以在标题上单击按钮,然后单击标题后只需将 numberOfRows 数组计数切换为 0。 @ShabbirAhmad 我如何在标题上按按钮?你能告诉我吗? 在 viewForHeader 方法中以编程方式添加按钮 @AbedNaseri 在标题UIView 中添加tap gesture 而不是button 你将return @AbedNaseri 你可以使用其中任何一个,但如果它像家庭控制器或主控制器,那么 Tableviewcontroller 很好。 【参考方案1】:

章节标题可以是可点击的(添加按钮使用 ViewForHeader 委托方法)并从情节提要中制作一个单元格(情节提要中的设计)并为名称、姓氏、城市等获取出口并根据章节更改标题(在 CellForRow 中)并重用它具有不同标签的所有部分的单元格 最后点击节标题将行高(使行高动态取一个变量)更改为关闭和打开。

【讨论】:

谢谢,但这只是一个例子,它不仅仅是表单中的textFields,还会有Switches和checkboxes和ImagePicker ... 在这种情况下,如果所有单元格都相同,您可以设计一个单元格并重复使用,或者如果每个部分都有不同的单元格,您应该尝试其他方法【参考方案2】:

我通过稍微改变想法解决了这个问题,将字段添加到stackviews,当点击stackView 的第一个元素即button 时,我将元素隐藏在stackView 的其余部分中,这样它就崩溃了。

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

【讨论】:

以上是关于UITableView Swift 3 的可折叠输入表单的主要内容,如果未能解决你的问题,请参考以下文章

如何快速制作嵌套的可折叠 uitableview?

在uitableview swift4中展开和折叠多级部分

TableView 使用 Swift 3 展开/折叠

展开或折叠时可展开的 UItableview 内容高度不同

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

iOS开发高级分享 - iOS的可折叠表视图