嵌套层级视图(用于评论系统)
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
(子级自己评论)。
因此,我的问题是:
- 如何最好地实施?作为 table 视图、集合视图或其他?我假设我会为评论视图本身创建一个 xib?
- 实际实现它的最佳方法是什么?我应该如何遍历 API 响应?
- 如何在左侧添加 margin/padding 以使评论看起来嵌套?
- 如何使单元格可展开?
- 在内存管理方面我应该了解什么?
谢谢。
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 单元格出队,这是由系统自动处理的良好内存性能
我想实现一个评论系统,用户可以在其中回复其他发表评论的人。我想在嵌套层次结构视图中显示这些评论,类似于下面的 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
(子级自己评论)。
因此,我的问题是:
- 如何最好地实施?作为 table 视图、集合视图或其他?我假设我会为评论视图本身创建一个 xib?
- 实际实现它的最佳方法是什么?我应该如何遍历 API 响应?
- 如何在左侧添加 margin/padding 以使评论看起来嵌套?
- 如何使单元格可展开?
- 在内存管理方面我应该了解什么?
谢谢。
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 单元格出队,这是由系统自动处理的良好内存性能