如何从TableView单元格收集多个动态值并将其存储在数组中

时间:2019-07-10 13:39:00

标签: ios swift uitableview

我正在使用复选标记功能选择表视图单元格,并且必须将该值保存在数组中(仅复选标记单元格名称),并且必须将这些数组值传递给url参数(POST)(例如:Dhoni,Kohili,Rohit )

这是我必须保存“ SwithTableView”单元格数据的代码

var checked = [Bool]()


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

    if tableView == switchTableView{
       return self.arrdata20.count
    } else
    {
        return self.arrdata.count
    }

    }

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

    if (tableView == self.switchTableView)
    {

        let cell:switchTableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell1") as! switchTableViewCell

        cell.nameLbl.text = (arrdata20[indexPath.row].name)
        print(cell.nameLbl.text)

        if (arrdata20[indexPath.row].emp_id == DataManager.sharedInstance.empID)
        {
            cell.isHidden=true
        }
        else{
            cell.isHidden=false
        }
        if checked[indexPath.row] == false{
            cell.accessoryType = .none


        } else if checked[indexPath.row] {
            cell.accessoryType = .checkmark


        }


        return cell

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

    switchTableView.deselectRow(at: indexPath, animated: true)
    if let cell = switchTableView.cellForRow(at: indexPath as IndexPath) {

        if cell.accessoryType == .checkmark {
            cell.accessoryType = .none
            checked[indexPath.row] = false
            print(indexPath.row)

        } else  {
            cell.accessoryType = .checkmark
            checked[indexPath.row] = true
        }
    }
}

1 个答案:

答案 0 :(得分:1)

保留选择的额外数组是不好的做法,并且很难维护,例如是否可以插入,删除或移动单元格。

强烈建议将信息存储在数据模型中

在您的结构中添加成员isSelected

struct Jsonstruct20 : Decodable {
    let name, emp_id : String

    var isSelected = false

    private enum CodingKeys : String, CodingKey { case name, emp_id }
}

var checked = [Bool]()

cellForRow中,根据isSelected设置选中标记(我删除了冗余代码)

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

    guard tableView == self.switchTableView else { return UITableViewCell() }

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell1") as! switchTableViewCell
    let item = arrdata20[indexPath.row]
    cell.nameLbl.text = item.name
    print(cell.nameLbl.text)
    cell.accessoryType = item.isSelected ? .checkmark : .none
    cell.isHidden = item.emp_id == DataManager.sharedInstance.empID
    return cell
}

didSelectRowAt中,只需切换isSelected并重新加载行即可更新单元格

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    guard tableView == self.switchTableView else { return }
    tableView.deselectRow(at: indexPath, animated: true)
    arrdata20[indexPath.row].isSelected = !arrdata20[indexPath.row].isSelected
    // or in Swift 4.2+ arrdata20[indexPath.row].isSelected.toggle()
    tableView.reloadRows(at: [indexPath], with: .none)
}

要获取所选单元格的所有名称,请过滤数据源数组

let selectedNames = Array(arrdata20.lazy.filter{$0.isSelected}.map{$0.name})