Метод cellForRowAt
не предназначен для l oop!
Я вижу, что вы используете свойство tag
для управления тем, что отображается в каждой ячейке. Из того факта, что вы увеличиваете tag
само время вызова cellForRowAt
, вы, похоже, предполагаете, что cellForRowAt
будет вызываться один раз для каждой строки по порядку. Это не тот случай, и вам не следует реализовывать cellForRowAt
следующим образом.
cellForRowAt
по существу задает вопрос: «Какой должна быть ячейка на этом пути индекса?», и вы дадите ответ. Путь индекса, о котором запрашивается табличное представление, является параметром indexPath
. Вы должны использовать этот параметр вместо вашего собственного свойства tag
, потому что табличное представление не спрашивает об этом.
Причина, по которой ваш код не работает, заключается в том, что ячейки табличного представления используются повторно. Когда ячейки прокручиваются вне поля зрения, они не откладываются в сторону, поэтому, когда необходимо отобразить новые ячейки табличного представления, их можно перенастроить так, чтобы они «выглядели так, как будто они являются новыми ячейками». По сути, это означает, что при прокрутке вверх вызывается cellForRowAt
для строк, которые вот-вот появятся. Вы не ожидали этого, не так ли?
Весь этот код, который устанавливает каждую ячейку, должен быть перемещен в инициализатор ThemeCell
. Кроме того, дизайн ячейки в раскадровке. cellForRowAt
должен настраивать ячейку только для пути индекса. ThemeCell
должен иметь свойства cellButton
и cellyi
, чтобы к ним можно было получить доступ.
Теперь cellForRowAt
можно записать так:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "themeCell", for: indexPath) as! ThemeCell
cell.cellButton.setImage(UIImage(named: SingletonViewController.themes[indexPath.row]), for: UIControl.State.normal)
cell.cellButton.addTarget(self, action: #selector(CustomViewController.backBTN(sender:)), for: .touchUpInside)
cell.cellyi.addTarget(self, action: #selector(CustomViewController.backBTN(sender:)), for: .touchUpInside)
if UserDefaults.standard.integer(forKey: "like") == indexPath.row {
cell.cellyi.backgroundColor = UIColor.green
} else {
cell.cellyi.backgroundColor = UIColor.red
}
// this line should be moved to viewDidLoad
// tableView.allowsSelection = false
return cell
}