TableView 单元格重复 Swift
TableView cells are repeating Swift
所以我向我的数据库发出 GET 请求,然后将数组中的每个元素添加到 var mainComment: Comments?
中的 ViewModel。在我的自定义单元格中,我将我的标签文本分配给 ViewModel 的 mainComment.likes
。我应该只为我的一个单元格获得一个类似的,但相反,一个类似的是为多个单元格重复。
https://giphy.com/gifs/L2U6FALmxWx981nO44
struct Comments: Codable {
var id:String?
var likes:Int?
}
import UIKit
import Foundation
class CommentViewModel {
var mainComment: Comments?
}
//CommentVC
var comments:[CommentViewModel] = []
func loadComments(completion:@escaping(()->())) {
guard let post_id = post_id else {
return
}
let getComments = GETComments(id: post_id, path: "comments")
getComments.getAllById { comments in
self.comments = comments.map { comment in
let ret = CommentViewModel()
ret.mainComment = comment
return ret
}
self.myTableView.reloadData()
completion()
}
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath as IndexPath) as! CommentCell
let item = comments[indexPath.item]
cell.viewModel = item
return cell
}
class CommentCell {
var viewModel: CommentViewModel? {
didSet {
if let item = viewModel {
if let numberOfLikes = item.mainComment?.likes {
self.numberOfLikes.text = "\(numberOfLikes)"
}
}
}
lazy var numberOfLikes:UILabel = {
let label = UILabel()
label.textAlignment = .center
label.text = "0"
return label
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
addSubview(numberOfLikes)
commentLikesConstraints()
}
func commentLikesConstraints() {
numberOfLikes.translatesAutoresizingMaskIntoConstraints = false
numberOfLikes.widthAnchor.constraint(equalToConstant: 60).isActive = true
numberOfLikes.heightAnchor.constraint(equalToConstant: 30).isActive = true
numberOfLikes.centerXAnchor.constraint(equalTo: likeBtn.centerXAnchor).isActive = true
numberOfLikes.topAnchor.constraint(equalTo: likeBtn.bottomAnchor, constant: -5).isActive = true
}
因为您使用 mainComment
和 likes
作为选项:
struct Comments: Codable {
var id:String?
var likes:Int?
}
您需要处理一个 else
案例(如果 viewModel
为 nil,可能还需要一个 else
案例):
var viewModel: CommentViewModel? {
didSet {
if let item = viewModel {
if let numberOfLikes = item.mainComment?.likes {
self.numberOfLikes.text = "\(numberOfLikes)"
} else {
self.numberOfLikes.text = "0"
}
} else {
// do what you need to do if viewModel is nil
}
}
}
所以我向我的数据库发出 GET 请求,然后将数组中的每个元素添加到 var mainComment: Comments?
中的 ViewModel。在我的自定义单元格中,我将我的标签文本分配给 ViewModel 的 mainComment.likes
。我应该只为我的一个单元格获得一个类似的,但相反,一个类似的是为多个单元格重复。
https://giphy.com/gifs/L2U6FALmxWx981nO44
struct Comments: Codable {
var id:String?
var likes:Int?
}
import UIKit
import Foundation
class CommentViewModel {
var mainComment: Comments?
}
//CommentVC
var comments:[CommentViewModel] = []
func loadComments(completion:@escaping(()->())) {
guard let post_id = post_id else {
return
}
let getComments = GETComments(id: post_id, path: "comments")
getComments.getAllById { comments in
self.comments = comments.map { comment in
let ret = CommentViewModel()
ret.mainComment = comment
return ret
}
self.myTableView.reloadData()
completion()
}
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath as IndexPath) as! CommentCell
let item = comments[indexPath.item]
cell.viewModel = item
return cell
}
class CommentCell {
var viewModel: CommentViewModel? {
didSet {
if let item = viewModel {
if let numberOfLikes = item.mainComment?.likes {
self.numberOfLikes.text = "\(numberOfLikes)"
}
}
}
lazy var numberOfLikes:UILabel = {
let label = UILabel()
label.textAlignment = .center
label.text = "0"
return label
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
addSubview(numberOfLikes)
commentLikesConstraints()
}
func commentLikesConstraints() {
numberOfLikes.translatesAutoresizingMaskIntoConstraints = false
numberOfLikes.widthAnchor.constraint(equalToConstant: 60).isActive = true
numberOfLikes.heightAnchor.constraint(equalToConstant: 30).isActive = true
numberOfLikes.centerXAnchor.constraint(equalTo: likeBtn.centerXAnchor).isActive = true
numberOfLikes.topAnchor.constraint(equalTo: likeBtn.bottomAnchor, constant: -5).isActive = true
}
因为您使用 mainComment
和 likes
作为选项:
struct Comments: Codable {
var id:String?
var likes:Int?
}
您需要处理一个 else
案例(如果 viewModel
为 nil,可能还需要一个 else
案例):
var viewModel: CommentViewModel? {
didSet {
if let item = viewModel {
if let numberOfLikes = item.mainComment?.likes {
self.numberOfLikes.text = "\(numberOfLikes)"
} else {
self.numberOfLikes.text = "0"
}
} else {
// do what you need to do if viewModel is nil
}
}
}