Прежде всего, вместо нескольких массивов используйте структуру для источника данных.
И не используйте дополнительные массивы или словари для поддержки выбора, это подвержено ошибкам и излишне дорого.
Добавьте логический член в структуру для выбранного состояния.
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) }