Ситуация
Существует табличное представление, показывающее список статей: Статья.Статья - это объект структуры, а список статей - это инициализированный ответ API.
Нам нужно добавить функцию, которая, когда пользователь касается ячейки, переходит в выбранное состояние.Чтобы указать выбор, я добавляю галочку в ячейку выбранного элемента.
cell.accessoryType = .checkmark
Проблема
Проблема
Здесь возникает проблема.Поскольку ячейки перерабатываются , каждый раз, когда запрашивается выбранная ячейка статьи, нам необходимо сохранить, какая ячейка выбрана.
struct Article используется во всем приложении, поэтому мы не должен просто добавить в него поле isSelected .
struct Article {
let title: String
var isSelected: Bool // <- Not good. Article used over the app.
}
временное решение
Некоторое решение, которое я использую, состоит в создании массива bool для хранениякакая строка выбрана.
var selectedRow: Bool = {
return articles.map { return false }
}()
Но этот подход кажется странным и также уязвим для вставки и удаления ячеек.
Вопрос
Есть ли лучшее решение?
Код решения нечетного пути
import UIKit
struct Article {
let title: String
}
class SampleTableViewController: UITableViewController {
// MARK: - Properties
let articles: [Article] = {
var tempArticles: [Article] = []
for i in 0...30 {
tempArticles.append(Article(title: "Article at index:\(i)"))
}
return tempArticles
}()
lazy var selectedRow: [Bool] = {
return articles.map { _ in false }
}()
let cellId = "cell"
// MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellId)
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return articles.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath)
cell.textLabel?.text = articles[indexPath.row].title
// Set selected state to a cell
cell.accessoryType = selectedRow[indexPath.row] ? .checkmark : .none
return cell
}
// MARK: - Table view delegate
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// Update selection
// This isn't the best way to update selection but just to make the example simple.
selectedRow[indexPath.row] = !selectedRow[indexPath.row]
tableView.reloadData()
}
}