Выбранная галочка UITableView Multi Selection не остается отмеченной - PullRequest
0 голосов
/ 22 июня 2019

У меня есть два 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 голосов
/ 22 июня 2019

Вам нужно создать один массив типа Int, а затем добавить значение по щелчку, если он не находится в массиве, и если он уже существует, поэтому необходимо удалить его из массива и установить флажок в методе cellForRowAt. * ​​1001 *

См.полный код

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()
    }
}
0 голосов
/ 22 июня 2019

Возможно, вы выполняете переход, чтобы перейти к контроллеру представления подкатегории, и каждый раз, когда вы выполняете этот переход, методы делегирования табличного представления и источник данных вызываются снова, и ячейки инициализируются заново.

Чтобы показать проверенные ячейки, вам потребуется сохранить проверенные значения в контроллере представления «Категории» и передать их в контроллер представления подкатегории и установить проверенные значения в методе 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)

       }
}

По любым дополнительным разъяснениям не стесняйтесь спрашивать

...