UITableViewCell является ссылочным типом. Поэтому, когда вы измените значение UILabel внутри ячейки, оно будет применено ко всем остальным ссылкам. Чтобы избежать этой проблемы, вы можете использовать массив.
Попробуйте этот код Пример:
Файл ViewController.swift
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{
@IBOutlet weak var tavleView: UITableView!
var items: [Book]?
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let item = items?[indexPath.row] {
item.isCheck = !item.isCheck
tableView.reloadRows(at: [indexPath], with: .none)
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items?.count ?? 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? BooklistTableViewCell {
if let item = items?[indexPath.row] {
if !item.isCheck {
cell.checkLabel.text = "○ \(item.isCheck) \(indexPath.row)"
}else{
cell.checkLabel.text = "● \(item.isCheck) \(indexPath.row)"
}
}
return cell
}
return UITableViewCell()
}
override func viewDidLoad() {
super.viewDidLoad()
items = (0..<20).map({ _ in Book(false) })
tavleView.delegate = self
tavleView.dataSource = self
tavleView.reloadData()
}
}
Файл BooklistTableViewCell.swift
import UIKit
class BooklistTableViewCell: UITableViewCell {
@IBOutlet weak var checkLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
}
Файл Book.swift
import Foundation
class Book {
var isCheck = false
init(_ isCheck: Bool) {
self.isCheck = isCheck
}
}