如何快速在TableView的不同多个部分中添加多行

时间:2019-05-21 11:19:11

标签: ios swift uitableview uibutton

我在该单元格中具有tableview,在该标题中创建了标题视图,并具有标签和按钮,我从数组中获取了标签值,并且该数组对有效的部分进行计数。但是当我点击按钮时,我需要扩展单元格,并且在该扩展的单元格中,我需要添加标签,但是当我点击按钮时,它会显示

  

错误:索引超出范围

numberOfRowsInSection中,并且不会展开。

这是我的代码:

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, DataSendingDelegateProtocol, FieldsDelegateProtocol {
var shouldCellBeExpanded:Bool = false
var indexOfExpendedCell:NSInteger = -1
// let kHeaderSectionTag: Int = 6900;

@IBOutlet weak var tableView: UITableView!
var sectionArray = [String]()
var sectionItemsArray = [String]()

override func viewDidLoad() {
    super.viewDidLoad()

    //self.tableView!.tableFooterView = UIView()
}

override func viewWillAppear(_ animated: Bool)
{
    super.viewWillAppear(animated)
}

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

func sendDataToTableRow(myData: String) {
    self.sectionItemsArray.append(myData)
    tableView.reloadData()
   // print(iteamsArray)
}

func sendDataToSectionLabel(myData: String) {
    self.sectionArray.append(myData)
    tableView.reloadData()
    print(sectionArray)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "segue") {
        let vc = segue.destination as! PopViewController
        vc.delegate = self
    }
    else if (segue.identifier == "fieldsSegue") {
        let vc = segue.destination as! FieldsViewController
        vc.delegate = self
    }
}
@objc func expandButnClicked(sender:UIButton){

    print("expand button tapped")

    shouldCellBeExpanded = !shouldCellBeExpanded
    indexOfExpendedCell = sender.tag

    if shouldCellBeExpanded {

        self.tableView.beginUpdates()
        self.tableView.endUpdates()
    }
    else {
        self.tableView.beginUpdates()
        self.tableView.endUpdates()
    }
}

@IBAction func addBtn(_ sender: Any) {
}

// MARK: - Tableview Methods
func numberOfSections(in tableView: UITableView) -> Int {

    return sectionArray.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if (self.indexOfExpendedCell == section) {
        let arrayOfItems = self.sectionItemsArray[section]
        return arrayOfItems.count
    } else {
        return 0
    }
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    if (self.sectionArray.count != 0) {
        return self.sectionArray[section] as? String
    }
    return ""
}

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

/*func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat{
    return 0;
}*/

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    let header: UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView
    header.contentView.backgroundColor = UIColor.colorWithHexString(hexStr: "#0075d4")
    header.textLabel?.textColor = UIColor.white

    let button = UIButton(frame: CGRect(x: 380, y: 10, width: 15, height: 15))
    button.backgroundColor = UIColor.green
    button.tag = section
    button.addTarget(self, action: #selector(expandButnClicked), for: .touchUpInside)

    header.addSubview(button)
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    if shouldCellBeExpanded && indexPath.row == indexOfExpendedCell {
        return 200
    }
    else {
        return 0
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "tableCell", for: indexPath) as! TableViewCell

    cell.textLab?.textColor = UIColor.black
    cell.textLab.text = sectionItemsArray[indexPath.row]
    cell.backgroundColor = UIColor.black
    return cell
}

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
}
}

请帮助我输入代码。

2 个答案:

答案 0 :(得分:0)

如果展开了部分,则在numberOfRowsInSection方法中返回sectionItemsArray数组计数

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if (self.indexOfExpendedCell == section) {
        return self.sectionItemsArray.count
    } else {
        return 0
    }
}

答案 1 :(得分:0)

您的问题可能是您实施的2种方法的精确定位:

func numberOfSections(in tableView: UITableView) -> Int {

    return sectionArray.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if (self.indexOfExpendedCell == section) {
        let arrayOfItems = self.sectionItemsArray[section]
        return arrayOfItems.count
    } else {
        return 0
    }
}

在第一个中,您说明了使用sectionArray的部分,而在第二个中,您使用了另一个数组sectionItemsArray。当sectionItemsArray[sectionArray.count-1]的元素数少于sectionItemsArray时,sectionArray可能会失败。

您可能应该保持一致,并且仅使用一个数组。在您的情况下,使用数组数组表示节和行是有意义的。但总的来说,使用自定义结构可能会更好。考虑如下内容:

class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    class Section {
        class Row {
            let name: String
            var shown: Bool = true
            init(name: String) { self.name = name }
        }
        let name: String
        var shown: Bool = true
        var rows: [Row]

        init(name: String, rows: [Row] = [Row]()) { self.name = name; self.rows = rows }
    }

    var sections: [Section]!

    override func viewDidLoad() {
        super.viewDidLoad()
        sections = [
            Section(name: "Empty"),
            Section(name: "Second section", rows: [.init(name: "row 1"), .init(name: "row 2")]),
            Section(name: "Third section", rows: [.init(name: "row 1"), .init(name: "row 2")])
        ]
    }


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

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return sections.filter { $0.shown }[section].name
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return sections.filter { $0.shown }[section].rows.filter { $0.shown }.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let name: String = sections.filter { $0.shown }[indexPath.section].rows.filter { $0.shown }[indexPath.row].name
        let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
        cell.textLabel?.text = name
        return cell
    }

}