UITableView Multi Selection的选定复选标记未保持选中状态

时间:2019-06-22 07:06:29

标签: ios swift uitableview swift4.2

我的申请中有两个UITableView。 一个用于类别,第二个用于子类别。 在选定的类别子类别UITableView的基础上,数据将发生变化,子类别UITableView具有多选功能,直到我的应用程序可以正常工作为止。

现在的问题是,当我位于类别UITableView上并单击“假设类别”单元格时,它将重定向到各个子类别,在该屏幕上,我选择了多个选项,然后单击“返回”按钮出现在顶部,并且当我再次单击“类别”选项卡时,我的选择(选中标记)消失了。

我希望我的复选标记被选中,只要我手动将其设置为未选中。

我该如何实现呢?

下面是我的应用程序的示例屏幕截图。

Category TableView

Appear this screen when I click on Category tab

Check mark disappear when clicking on the back button and again click in Category cell

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tblSubCategory.cellForRow(at: indexPath)

    if cell!.isSelected
    {
        cell!.isSelected = false
        if cell!.accessoryType == UITableViewCell.AccessoryType.none
        {
            if strCategoryData == "Category" {
                cell!.accessoryType = UITableViewCell.AccessoryType.checkmark
                let objectForCell = arrSubCategoryData[indexPath.row]
                arrSelectedCetegoryIndex.append(objectForCell)
                let defaults = UserDefaults.standard
                defaults.set(arrSelectedCetegoryIndex, forKey: "categoryKey")
            }
            else if strCategoryData == "Brand" {
                cell!.accessoryType = UITableViewCell.AccessoryType.checkmark
                let objectForCell = arrSubCategoryData[indexPath.row]
                arrSelectedBrandIndex.append(objectForCell)
            }
            else if strCategoryData == "Color" {
                cell!.accessoryType = UITableViewCell.AccessoryType.checkmark
                let objectForCell = arrSubCategoryData[indexPath.row]
                arrSelectedColorIndex.append(objectForCell)
            }
            else if strCategoryData == "Size" {
                cell!.accessoryType = UITableViewCell.AccessoryType.checkmark
                let objectForCell = arrSubCategoryData[indexPath.row]
                arrSelectedSizeIndex.append(objectForCell)
            }
        }
        else
        {
            if strCategoryData == "Category" {
                cell!.accessoryType = UITableViewCell.AccessoryType.none
                let selectedIndex = (tblSubCategory.indexPathForSelectedRow?.row)!
                let selectedIndexValue = arrSubCategoryData[selectedIndex]
                print(selectedIndexValue)
                let index = arrSelectedCetegoryIndex.firstIndex(of: selectedIndexValue)!
                arrSelectedCetegoryIndex.remove(at: index)
            }
            else if strCategoryData == "Brand" {
                cell!.accessoryType = UITableViewCell.AccessoryType.none
                let selectedIndex = (tblSubCategory.indexPathForSelectedRow?.row)!
                let selectedIndexValue = arrSubCategoryData[selectedIndex]
                print(selectedIndexValue)
                let index = arrSelectedBrandIndex.firstIndex(of: selectedIndexValue)!
                arrSelectedBrandIndex.remove(at: index)
            }
            else if strCategoryData == "Color" {
                cell!.accessoryType = UITableViewCell.AccessoryType.none
                let selectedIndex = (tblSubCategory.indexPathForSelectedRow?.row)!
                let selectedIndexValue = arrSubCategoryData[selectedIndex]
                print(selectedIndexValue)
                let index = arrSelectedColorIndex.firstIndex(of: selectedIndexValue)!
                arrSelectedColorIndex.remove(at: index)
            }
            else if strCategoryData == "Size" {
                cell!.accessoryType = UITableViewCell.AccessoryType.none
                let selectedIndex = (tblSubCategory.indexPathForSelectedRow?.row)!
                let selectedIndexValue = arrSubCategoryData[selectedIndex]
                print(selectedIndexValue)
                let index = arrSelectedSizeIndex.firstIndex(of: selectedIndexValue)!
                arrSelectedSizeIndex.remove(at: index)
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您可能正在执行segue进入子类别视图控制器,并且每次执行此segue时,都会再次调用tableview委托和datasource方法,并重新初始化单元格。

要显示已选中的单元格,您需要将选中的值保存在Categories视图控制器中,并将它们传递给SubCategory View Controller并在cellForRowAtIndexpath方法中设置选中的值。

以下是如何实现该示例:

class CategoryViewController: UIViewController {

    var checkedValues = [[Bool]]()
    var indexSelected = -1

    override func viewDidLoad() {
        super.viewDidLoad()


        // your code here
        checkedValues.append(contentsOf: repeatElement([], count: yourCategArray.count))


    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // your code here
        indexSelected = indexPath.row
        self.performSegue(withIdentifier: "yourSegueIdentifierHere", sender: self)
    }    


    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        (segue.destination as! SubCategoryViewController).parentCategoryVC = self

    }

}

现在用于其他View Controller:

class SubCategoryViewController: UIViewController {

    var parentCategoryVC = CategoryViewController()


    override func viewDidLoad() {
        super.viewDidLoad()

        if parentCategoryVC.checkedValues[parentCategoryVC.indexSelected].count == 0 {
            parentCategoryVC.checkedValues[parentCategoryVC.indexSelected].append(contentsOf: repeatElement(false, count: yourSubCategArray.count))

        }

        // your code here

    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return yourSubCategArray.count
   }





    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell...

        if parentCategoryVC.checkedValues[parentCategoryVC.indexSelected][indexPath.row] { cell.accessoryType = .checkmark } else { cell.accessoryType = .none }

        // your code here

        return cell

    }


        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            // your code 
            parentCategoryVC.checkedValues[parentCategoryVC.indexSelected][indexPath.row] = !parentCategoryVC.checkedValues[parentCategoryVC.indexSelected][indexPath.row]
            tableView.reloadRows(at: indexPath, with: UITableViewRowAnimation.none)

       }
}

如有任何其他澄清,请随时询问

答案 1 :(得分:0)

您需要创建一个Int类型的数组,然后单击时附加值(如果不在数组中并且已经存在),因此您需要从数组中删除并在cellForRowAt方法中设置选中标记。

请参阅完整的代码

import UIKit

class testViewController: UIViewController {

    
    var selectedRows: [Int] = []
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

extension testViewController: UITableViewDelegate, UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")!
        cell.textLabel?.text = "Welcome " + (indexPath.row+1).description
        cell.selectionStyle = .none
        cell.accessoryType = selectedRows.contains(indexPath.row) ? .checkmark : .none
        return cell
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 50
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if self.selectedRows.contains(indexPath.row) {
            
            if let index = self.selectedRows.firstIndex(of: indexPath.row) {
                self.selectedRows.remove(at: index)
            }
        } else {
            self.selectedRows.append(indexPath.row)
        }
        tableView.reloadData()
    }
}