嵌套层级视图(用于评论系统)

Nested hierarchy view (for comment system)

我想实现一个评论系统,用户可以在其中回复其他发表评论的人。我想在嵌套层次结构视图中显示这些评论,类似于下面的 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(基本上是评论中的"level"层级)、children_count(直接子级的数量)和 children(子级自己评论)。

因此,我的问题是:

  1. 如何最好地实施?作为 table 视图、集合视图或其他?我假设我会为评论视图本身创建一个 xib?
  2. 实际实现它的最佳方法是什么?我应该如何遍历 API 响应?
  3. 如何在左侧添加 margin/padding 以使评论看起来嵌套?
  4. 如何使单元格可展开?
  5. 在内存管理方面我应该了解什么?

谢谢。

1- 个人会选择 tableView

2- 这是一个递归操作,以 let children: [Datum]? 结束 empty/nil 就像

// 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- 您需要限制对评论的回复数量,因为没有屏幕宽度适合 un-known 回复数量顺便说一句,它是关于嵌套的 tableView padding

4- 你需要玩 heightForRowAt 否则你必须对嵌套的 tables 或更好的固定高度做一些计算 more ,也更容易显示嵌套的评论在另一个单独的 vc 中,例如 facebook

5- 简单地不要将多个 vc 彼此嵌套且计数超过 2/3 还使用 table 单元格出队,这是由系统自动处理的良好内存性能