CollectionView中用于评论和回复的多个单元格 [英] Multiple Cells for Comments and Reply in a CollectionView
问题描述
我有两种不同的单元格类型,一种用于评论,另一种用于回复.我试图将它们呈现在相同的 collectionView
中,然后像这样将它们分组:每个带有特定ID的评论都在其下进行答复.但是,经过任何尝试,我都失败了.
I have two different cells types one is for comments and the other one for replies. I'm trying to render them in the same collectionView
and then maybe grouping them like so: each comment with a certain id to have under it its replies. However, with any attempt, I failed.
您将如何处理?
private var comments = [Comment]()
private var replies = [Reply]()
var items: [Any] = []
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return items.count
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
// let item = items[indexPath.item]
var item = items[indexPath.item]
if item is Comment.Type {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CommentCell.cellId, for: indexPath) as! CommentCell
cell.comment = items[indexPath.item] as? Comment
print(item)
return cell
} else {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: RepliesCell.cellId, for: indexPath) as! RepliesCell
cell.reply = items[indexPath.item] as? Reply
return cell
}
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 0
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let item = items[indexPath.item]
if item is CommentCell.Type {
let dummyCell = CommentCell(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 50))
dummyCell.comment = items[indexPath.item] as? Comment
dummyCell.layoutIfNeeded()
let targetSize = CGSize(width: view.frame.width, height: 250)
let estimatedSize = dummyCell.systemLayoutSizeFitting(targetSize)
let height = max(40 + 8 + 8, estimatedSize.height)
return CGSize(width: view.frame.width, height: height)
} else {
let dummyCell = RepliesCell(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 50))
dummyCell.reply = items[indexPath.item] as? Reply
dummyCell.layoutIfNeeded()
let targetSize = CGSize(width: view.frame.width, height: 250)
let estimatedSize = dummyCell.systemLayoutSizeFitting(targetSize)
let height = max(40 + 8 + 8, estimatedSize.height)
return CGSize(width: view.frame.width, height: height)
}
}
}
推荐答案
最佳实践解决方案
创建一个包含回复"对象列表的回复"模型和评论"模型
Create a Reply model and Comment model which contains Replies object list
class Comment {
var commentId: Int
var commentText: String
var replies: [Reply]
init(commentId: Int, commentText: String, replies: [Reply]) {
self.commentId = commentId
self.commentText = commentText
self.replies = replies
}
}
class Reply {
var replyId: Int
var replyText: String
init(replyId: Int, replyText: String) {
self.replyId = replyId
self.replyText = replyText
}
}
为评论标题创建UICollectionReusableView
Create a UICollectionReusableView for comment header
class CommentHeader: UICollectionReusableView {
@IBOutlet weak var commentTextLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
func configure(with comment: Comment) {
commentTextLabel.text = comment.commentText
}
}
创建一个UICollectionViewCell进行回复
Create a UICollectionViewCell for reply
class ReplyCell: UICollectionViewCell {
@IBOutlet weak var replyTextLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
func configure(with reply: Reply) {
replyTextLabel.text = reply.replyText
}
}
创建一个具有UICollectionView和注释数据列表的CommentViewController类
Create a CommentsViewController class which has a UICollectionView and comments data list
请注意,标头和单元格已通过viewDidLoad方法注册到集合视图中
Attention that the header and cell are registered into the collection view in the viewDidLoad method
class CommentsViewController: UIViewController {
@IBOutlet weak var collectionView: UICollectionView!
var comments: [Comment] = [Comment]()
override func viewDidLoad() {
super.viewDidLoad()
collectionView.register(UINib(nibName: "CommentHeader", bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "CommentHeaderIdentifier")
collectionView.register(UINib(nibName: "ReplyCell", bundle: nil), forCellWithReuseIdentifier: "ReplyCellIdentifier")
comments = getDummyComments(with: 3)
}
func getDummyComments(with count: Int) -> [Comment] {
var comments = [Comment]()
for i in 1...count {
comments.append(Comment(commentId: i, commentText: "Comment \(i)", replies: getDummyReplies(with: i)))
}
return comments
}
func getDummyReplies(with count: Int) -> [Reply] {
var replies = [Reply]()
for i in 1...count {
replies.append(Reply(replyId: i, replyText: "Reply \(i)"))
}
return replies
}
}
最后设置UICollectionView数据源和委托方法
And finally set UICollectionView datasource and delegate methods
extension CommentsViewController: UICollectionViewDataSource {
// for cell
func numberOfSections(in collectionView: UICollectionView) -> Int {
return comments.count
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return comments[section].replies.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let replyCell = collectionView.dequeueReusableCell(withReuseIdentifier: "ReplyCellIdentifier", for: indexPath) as! ReplyCell
replyCell.configure(with: comments[indexPath.section].replies[indexPath.row])
return replyCell
}
// for header
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
if kind == UICollectionElementKindSectionHeader {
let commentHeader = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "CommentHeaderIdentifier", for: indexPath) as! CommentHeader
commentHeader.configure(with: comments[indexPath.section])
return commentHeader
}
return UICollectionReusableView()
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
return CGSize(width: collectionView.frame.width, height: 100) // this height is used for the example, you can use self sizing for height
}
}
extension CommentsViewController: UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: collectionView.frame.width, height: 100) // this height is used for the example, you can use self sizing for height
}
}
让我们看看评论屏幕:)
Let's see the comments screen :)
这篇关于CollectionView中用于评论和回复的多个单元格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!