嵌套层次结构视图(用于注释系统)



我想实现一个评论系统,用户可以回复其他发表评论的人。我想在嵌套的层次结构视图中显示这些评论,类似于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(子项注释本身)。

因此,我的问题是:

  1. 如何最好地实施这一点?作为表视图、集合视图还是其他视图?我想我会为评论视图本身创建一个 xib?
  2. 实际实现这一点的最佳方法是什么?我应该如何循环访问 API 响应?
  3. 如何在左侧添加边距/填充以使注释看起来嵌套?
  4. 如何使细胞可扩增?
  5. 在内存管理方面,我应该了解什么?

谢谢。

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,也使用表单元格被取消排队,这是系统自动处理的良好内存性能

最新更新