如何将选定的tableview行存储在数组中?

问题描述

我知道有比我的方式更好的选择行的方法(也欢迎选择行)。否则我只需要知道如何从 tableview 存储选定的行,当点击完成按钮(栏项目)

注意:在我的 tableview 中,我有多个部分,如果我从一个部分中选择一行,其他部分的行将被取消选择。

编辑 1

更多说明, 假设有 3 个部分,每个部分有 5 行。

step1 : 我在 section1 中选择 row1 和 row2

step2:如果我从第 2 节或第 3 节中选择任何行,则第 1 节的所有行都将被取消选择。

第 3 步:假设用户从第 3 部分中选择第 3 行和第 5 行,然后按下完成按钮

第 4 步:现在我想将行的值(名称)存储在一个数组中。

我的代码如下,

extension TradeselectionController {
    
    override func numberOfSections(in tableView: UITableView) -> Int {
        
        if isSearching && searchController.searchBar.text != "" {
            return viewmodel.filteredCategories?.count ?? 0
        }else{
            return viewmodel.categorySkills.count
        }
        
    }
    
    override func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
        
        if isSearching && searchController.searchBar.text != ""{
            
            return viewmodel.filteredCategories?[section].skill.count ?? 0
            
        }else{
            let section = viewmodel.categorySkills[section]
            return section.skill.count
        }
        
    }
    
    override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        var cell = tableView.dequeueReusableCell(withIdentifier: "TradeselectionTableViewCell")
        
        if ((cell != nil)) {
            
            cell = UITableViewCell(style: .subtitle,reuseIdentifier: "TradeselectionTableViewCell")
        }
        
        if isSearching && searchController.searchBar.text != "" {
            
            cell?.textLabel?.textColor = UIColor.lightGray
            cell?.textLabel?.font = UIFont.systemFont(ofSize: 10)
            cell?.textLabel?.text = "(\(String(describing: viewmodel.categorySkills[indexPath.section].vName)))"
            
            let text =
                viewmodel.filteredCategories?[indexPath.section].skill[indexPath.row].vName
            
            //don't change order,change text size
            cell?.detailTextLabel?.font = UIFont.systemFont(ofSize: 16)
            cell?.detailTextLabel?.text = text
            
            
        }else{
            cell?.textLabel?.text = viewmodel.categorySkills[indexPath.section].skill[indexPath.row].vName
            
            
        }
        if selectedIngredients.contains(indexPath){
            cell?.accessoryType = .checkmark
            cell?.backgroundColor = UIColor.lightGray
        }else{
            cell?.accessoryType = .none
            cell?.backgroundColor = .none
        }
        
        return cell!
    }
    
        override func tableView(_ tableView: UITableView,titleForHeaderInSection section: Int) -> String? {
    
            if isSearching && searchController.searchBar.text != ""{
                return viewmodel.filteredCategories?[section].vName
            }else{
                let titleText = viewmodel.categorySkills[section].vName
                return titleText
            }
        }
    
    override func tableView(_ tableView: UITableView,didSelectRowAt indexPath: IndexPath) {
        
        lastSelectedindexPath = indexPath.section
        if self.selectedIngredients.contains(indexPath){
            self.selectedIngredients.remove(indexPath)
            totalSkills[indexPath.row] = false
        }else{
            self.selectedIngredients.insert(indexPath)
            totalSkills[indexPath.row] = true
            
        }
        self.tableView.reloadData()
        
    }
    override func tableView(_ tableView: UITableView,willSelectRowAt indexPath: IndexPath) -> IndexPath? {
        print(selectedIngredients)
        if lastSelectedindexPath != nil {
            if lastSelectedindexPath != indexPath.section {
                selectedIngredients.removeAll()
                print(selectedIngredients)
            }
        }
        
        return indexPath
    }
    //    override func tableView(_ tableView: UITableView,heightForRowAt indexPath: IndexPath) -> CGFloat {
    //        return 30
    //    }
    override func tableView(_ tableView: UITableView,heightForHeaderInSection section: Int) -> CGFloat {
        return 50
    }
    
    override func tableView(_ tableView: UITableView,viewForHeaderInSection section: Int) -> UIView? {
        
        let headerView = UIView(frame: CGRect(x: 0,y: 0,width: tableView.frame.width,height: 50))
        
        
        //   headerView.addRoundCorner(10)
        headerView.backgroundColor = .lightGray
        let label = UILabel()
        label.frame = CGRect.init(x: 10,y: 5,width: headerView.frame.width-10,height: headerView.frame.height-10)
        label.text = viewmodel.categorySkills[section].vName
        label.font = ThemeFonts.font(with: 16,for: .bold)
        label.textColor = ThemeColors.primaryTextColor
        headerView.addSubview(label)
        return headerView
    }
}

我尝试过如下所示,但不起作用....

   @objc private func doneAction(_ sender: Any?) {
        
        var selectedSkills = [Skill]()
        if let selectedindex = tableView.indexPathsForSelectedRows {
            selectedindex.forEach({
                //viewmodel.categorySkills[indexPath.section].skill[indexPath.row].vName
                //let skill = viewmodel.skills[$0.row]
                let skill = filteredobjects[$0.row]
                print(skill)
                //           selectedSkills.append(skill)
            })
        }

        dismiss(animated: true,completion: nil)
    }

解决方法

向表示数据模型中单元格的结构添加选定标志。(对于分段表视图,结构的二维数组可以很好地用作数据模型。)

在响应用户选择单元格的代码中维护该标志。