我想实现一个评论系统,用户可以回复其他发表评论的人。我想在嵌套的层次结构视图中显示这些评论,类似于reddit应用程序"Apollo"在下面所做的:
https://i.imgur.com/JiLLsjs.mp4
如您所见,注释以嵌套格式排序。
以下是我的 API 响应:
{
"success": true,
"data": {
"comments": {
"data": [
{
"id": 1,
"parent_id": 0,
"depth": 0,
"message": "1",
"children_count": 2,
"children": [
{
"id": 2,
"parent_id": 1,
"depth": 1,
"message": "2",
"children_count": 1,
"children": [
{
"id": 3,
"parent_id": 2,
"depth": 2,
"message": "3",
"children_count": 0,
"children": []
}
]
},
{
"id": 4,
"parent_id": 1,
"depth": 1,
"message": "2",
"children_count": 0,
"children": []
}
]
},
{
"id": 5,
"parent_id": 0,
"depth": 0,
"message": "1",
"children_count": 0,
"children": []
}
]
}
}
}
如您所见,每个comment
对象都有一个parent_id
(父注释 ID)、一个depth
(基本上是层次结构中注释的"级别")、一个children_count
(直接子项的数量)和children
(子项注释本身)。
因此,我的问题是:
- 如何最好地实施这一点?作为表视图、集合视图还是其他视图?我想我会为评论视图本身创建一个 xib?
- 实际实现这一点的最佳方法是什么?我应该如何循环访问 API 响应?
- 如何在左侧添加边距/填充以使注释看起来嵌套?
- 如何使细胞可扩增?
- 在内存管理方面,我应该了解什么?
谢谢。
1-个人会使用表格视图
2-这是一个递归操作,以let children: [Datum]?
为空/零结束,例如
// MARK: - Empty
struct Root: Codable {
let success: Bool
let data: DataClass
}
// MARK: - DataClass
struct DataClass: Codable {
let comments: Comments
}
// MARK: - Comments
struct Comments: Codable {
let data: [Datum]
}
// MARK: - Datum
struct Datum: Codable {
let id, parentID, depth: Int
let message: String
let childrenCount: Int
let children: [Datum]?
}
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let res = decoder.decode(Root.self, from:data)
3-您需要限制对评论的回复数量,因为没有屏幕宽度适合未知的回复数量,顺便说一句,这是关于嵌套表视图填充
4-您需要玩heightForRowAt
或者您必须对嵌套表或更好的固定高度进行一些计算,也更容易在另一个单独的vc中显示嵌套评论,因此喜欢facebook
5-简单地不要将多个vcs嵌套在一起,计数超过2/3,也使用表单元格被取消排队,这是系统自动处理的良好内存性能