Сохранить состояние отмеченной ячейки в табличном представлении в Swift 4.2 - PullRequest
0 голосов
/ 01 ноября 2019

Я сделал табличное представление в контроллере представления и заполнил его программно. Я могу пометить ячейку в нужное время, но когда я вернусь к этому экрану, его там нет.

Это мои массивы:

let devCourses = [("Sound"),("Vibrate"),("Both"),("None")]

let devCousesImages = [UIImage(named: "speaker"), UIImage(named: "Group 1094"), UIImage(named: "Group 1093"), UIImage(named: "speaker-1")]

Вот мойкод для didSelectRowAt:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark

    }

Вот код для didDeselectRowAt:

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        tableView.cellForRow(at: indexPath)?.accessoryType = .none
    }



func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell=tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath as IndexPath) as! VibTableViewCell

        let courseTitle = devCourses[indexPath .row]

        let Images = devCousesImages[indexPath .row]

        cell.label.text=courseTitle
        cell.label.textColor = UIColor.darkGray
        cell.photo.image=Images

        return cell
    }

Я хочу, чтобы флажок был там, когда я вернусь к экрану

Ответы [ 4 ]

0 голосов
/ 02 ноября 2019

Вы можете использовать мое решение.

Сохраните состояние ваших ячеек в файле plist с помощью NSCoder. Даже если вы перезапустите приложение - вы не потеряете свои данные.

import UIKit

class TableViewController: UITableViewController {

    var itemsArray : [Item] = [Item(name: "mom", done: true), Item(name: "pap", done: false), Item(name: "Lena", done: false), Item(name: "Gleb", done: false), Item(name: "Sasha", done: false), Item(name: "Max", done: false)]


    /* path to custom plist file */
    let dataFilePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("Items.plist")

    override func viewDidLoad() {
        super.viewDidLoad()

        if let filePath = dataFilePath {
            print(filePath)
        }

        loadData()
    }

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return itemsArray.count
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        let item = itemsArray[indexPath.row]
        cell.accessoryType = item.done ? .checkmark : .none
        cell.textLabel?.text = item.name
        // Configure the cell...

        return cell
    }

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

        itemsArray[indexPath.row].done = !itemsArray[indexPath.row].done

        /* when state is changed - save it to plist file */
        saveDate()

        tableView.deselectRow(at: indexPath, animated: true)
    }


    /* save array to plist file (you can see it inside folder from consol) */
    func saveDate() {
        let encoder = PropertyListEncoder()
        do {
            let data = try encoder.encode(itemsArray)
            try data.write(to: dataFilePath!)
        } catch {
            print(error.localizedDescription)
        }
        self.tableView.reloadData()
    }


    /* load data from plist file */
    func loadData() {

        if let data = try? Data(contentsOf: dataFilePath!) {
            let decoder = PropertyListDecoder()
            do {
                itemsArray = try decoder.decode([Item].self, from: data)
            } catch {
                print(error.localizedDescription)
            }
        }

    }
}

dataModel:

import Foundation

struct Item : Encodable, Decodable {
    var name : String = ""
    var done : Bool = false
}

0 голосов
/ 01 ноября 2019

Создать словарь [IndexPath:Bool], чтобы отслеживать состояние выбранных строк.

var dict: [IndexPath:Bool] = [:]

в tableView(_:, didSelectRowAt:) добавить следующую строку:

dict[indexPath] = true

в tableView(_:, didDeselectRowAt:) добавить следующую строку:

dict[indexPath] = false

в tableView(_:, cellForRowAt:) добавить следующие строки:

let selected = dict[indexPath] ?? false
cell.accessoryType = selected ? .checkmark : .none
0 голосов
/ 02 ноября 2019

Прежде всего, вместо нескольких массивов используйте структуру для источника данных.

И не используйте дополнительные массивы или словари для поддержки выбора, это подвержено ошибкам и излишне дорого.

Добавьте логический член в структуру для выбранного состояния.

struct Course : Codable {
    let name : String
    let image : String
    var isSelected : Bool
}

Объявите массив источника данных

var courses = [Course(name: "Sound", image: "speaker", isSelected: false),
               Course(name: "Vibrate", image: "Group 1094", isSelected: false),
               Course(name: "Both", image: "Group 1093", isSelected: false),
               Course(name: "None", image: "speaker-1", isSelected: false)]

В cellForRowAt установите флажок в зависимости от isSelected

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! VibTableViewCell
    let course = courses[indexPath.row]
    cell.label.text = course.name
    // define the text color in Interface Builder
    // cell.label.textColor = UIColor.darkGray
    cell.photo.image = UIImage(named: course.image)
    cell.accessoryType = course.isSelected ? .checkmark : .none

    return cell
}

В didSelectRowAt переключите значение isSelected в источнике данных и перезагрузите строку

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    courses[indexPath.row].isSelected.toggle()
    tableView.reloadRows(at: indexPath, with: .none)
}

Наконец удалите метод didDeselectRowAt

Для сохранения массива вы можете написать

do {
    let data = try JSONEncoder().encode(courses)
    UserDefaults.standard.set(data, forKey: "Courses")
} catch { print(error) }
0 голосов
/ 01 ноября 2019

Как вы хотите вернуться к просмотру контроллера, чтобы показать выбранную ячейку. затем вы должны сохранить выбранный массив ячеек и после этого в viewDidLoad / viewWillappear установить выбранную ячейку, как показано ниже: код

for index in selectedArray {
            self.tableView.selectRow(at: IndexPath(row: index, section: 0), animated: false, scrollPosition: .none)
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...