Вам необходимо поддерживать состояние вашего UITableViewCell
в вашей tableView's
dataSource
модели. Я попытаюсь уточнить это на примере.
1. Предположим, вы model
выглядите примерно так:
class Post {
var isLiked = false
var likeCount = 0
}
2. Далее необходимо создать пользовательский UITableViewCell
таким образом, чтобы он изменял dataSource
и UI
согласно действию button
, т.е.
class CustomCell: UITableViewCell {
@IBOutlet weak var countLabel: UILabel!
@IBOutlet weak var likeButton: UIButton!
var post: Post?
func configure(with post: Post) {
countLabel.text = "\(post)"
likeButton.isSelected = post.isLiked
}
@IBAction func likeButtonTapped(_ sender: UIButton) {
sender.isSelected = !sender.isSelected
if let post = post {
post.isLiked = sender.isSelected
if sender.isSelected {
post.likeCount += 1
} else {
post.likeCount -= 1
}
countLabel.text = "\(post.likeCount)"
}
}
}
3. Наконец, методы UITableViewDataSource
будут,
class VC: UIViewController, UITableViewDataSource {
var posts = [Post]()
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return posts.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomCell
cell.configure(with: posts[indexPath.row])
return cell
}
}
В приведенном выше коде при каждом нажатии likeButton
обновляются UI
и dataSource
. Таким образом, всякий раз, когда cell
отображается снова, вы автоматически увидите последние обновленные данные.
Нет необходимости перезагружать tableView
или cell
при каждом нажатии likeButton
. Перезагрузка приведет только к дополнительным накладным расходам.