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

时间:2019-06-23 21:52:53

标签: ios swift xcode swift4

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

答案 0 :(得分:-1)

1-个人会使用tableView

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-您需要限制对评论的答复数量,因为没有屏幕宽度适合未知的答复数量,这是关于嵌套的tableView填充

4-您需要使用heightForRowAt进行操作,否则您将需要为嵌套表进行一些计算或以更高的固定高度进行更好的固定,更容易的是在另一个单独的vc中显示嵌套的注释,例如脸书

5-根本不将多个vc相互嵌套,其数量超过2/3,而且也使用了表单元出队,这是系统自动处理的良好内存性能