Галочка Swift Tableview исчезла после перезапуска viewcontroller - PullRequest
0 голосов
/ 04 ноября 2019

В моем случае я загружаю JSON данные в tableview. Здесь реализованы опции выбора нескольких ячеек таблицы checkmark и uncheckmark. Если перейти к предыдущему viewcontroller и снова вернуться к контроллеру таблицы, то последняя выбранная галочка исчезла. Как store это?

JSON Codable

// MARK: - Welcome
struct Root: Codable {
    let status: Bool
    let data: [Datum]
}

// MARK: - Datum
struct Datum: Codable, Hashable {
    let userid, firstname, designation: String?
    let profileimage: String?
}

Пользовательский класс ячеек

class MyCustomCell: UITableViewCell {
    @IBOutlet weak var profileImage: UIImageView!
    @IBOutlet weak var nameCellLabel: UILabel!
    @IBOutlet weak var subtitleCellLabel: UILabel!
}

Код для галочки Tableview

 var studentsData = [Datum]()
 var sessionData = Set<Datum>()

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell:MyCustomCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as! MyCustomCell
        let item = self.studentsData[indexPath.row]
        cell.nameCellLabel.text = item.firstname
        cell.subtitleCellLabel.text = item.designation
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        let item = self.studentsData[indexPath.row]
        if let cell = tableView.cellForRow(at: indexPath) {
            if cell.accessoryType == .checkmark {
                cell.accessoryType = .none

                // UnCheckmark cell JSON data Remove from array
                self.sessionData.remove(item)
                print(sessionData)

            } else {
                cell.accessoryType = .checkmark

                // Checkmark selected data Insert into array
                self.sessionData.insert(item)
                print(sessionData)
            }
        }
    }

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Создать средство для сохранения статуса галочки в вашей структуре данных

struct Datum: Codable, Hashable {
    let userid, firstname, designation: String?
    let profileimage: String?
    var selected: Bool = false
}

Установите значение при создании ячейки

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell:MyCustomCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as! MyCustomCell
        let item = self.studentsData[indexPath.row]
        cell.nameCellLabel.text = item.firstname
        cell.subtitleCellLabel.text = item.designation
        cell.accessoryType = item.selected ? .checkmark : .none
        return cell
    }

А затем в didSelectRowAt заменитеif блок с приведенным ниже, чтобы сохранить изменения обратно в данные студента и затем сбросить галочку соответственно:

 self.studentsData[indexPath.row].selected.toggle()
 cell.accessoryType = studentsData[indexPath.row].selected ? .checkmark : .none
1 голос
/ 04 ноября 2019

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

var SELECTED_ITEMS= [YOUR_DATA_TYPE]()//It must be global within tableViewController

в случае, если разрешен множественный выбор

   func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            tableView.deselectRow(at: indexPath, animated: true)
            let item = self.studentsData[indexPath.row]
            if SELECTED_ITEMS.contain(item){
                SELECTED_ITEMS.remove(item)
            }else{
                SELECTED_ITEMS.append(item)
            }
}

Помните, что SELECTED_ITEM должен быть массивом ваших данных таблицы, а SELECTED_ITEM - точно таким же типом вашей таблицы. данные. Также, если вы инициализируете свою модель в ViewDidLoad или ViewWillAppear в контроллере табличных представлений, make должна SELECTED_ITEMS и SELECTED_ITEM не сбрасываться при появлении табличного представления.

затем

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
          ........
           cell.accessoryView = SELECTED_ITEMS.contain(item) ? .checkmark:.none// Multi Selection
          .........

    }

В общем,Вы обновляете свою модель, переменную или массив или все, что вписывается в ваш код, чтобы отслеживать, какой путь индекса выбран / не выбран. Затем в cellForRowAt вы можете проверить вышеуказанную переменную / массив ... для установки аксессуара.

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath){}

также будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...