создавать пользовательские вложенные ячейки таблицы - PullRequest
0 голосов
/ 10 октября 2018

Я хочу создать вложенный раздел комментариев.Я использую Firebase в качестве базы данных.В моем приложении у меня есть раздел комментариев к каждому сообщению.Зарегистрированные пользователи имеют возможность комментировать сообщения, а их комментарии также можно комментировать, создавая вложенный эффект.

Итак, сначала я отображаю комментарии, которые были сделаны к исходному сообщению.Что я хочу сделать, так это просмотреть каждый комментарий и проверить, есть ли комментарий для этого комментария, и если он есть, я хочу, чтобы он отображался непосредственно под этим комментарием.Так же, как Instagram или Facebook.

Вот пример JSON того, как будет выглядеть вложенный комментарий в Firebase

{
  "author" : "patient0",
  "comments" : {
    "comment-487" : {
      "author" : "Doctor1",
      "comments" : {
        "comment-489" : {
          "content" : "Your internal capsule in your cerebrum was affected by the stroke",
          "id" : "comment-489",
          "reply_to" : "comment-487",
          "reply_to_type" : "comment"
        },
        "comment-490" : {
          "author" : "Doctor2",
                "content" : "Your internal capsule is closely associated with your basal ganglia structures",
          "id" : "comment-490",
          "reply_to" : "comment-487",
          "reply_to_type" : "comment"
        }
      },
      "content" : "I recently had a stroke",
      "id" : "comment-487",
      "post_id" : "post-1069",
      "reply_to" : "post-1069",
      "reply_to_type" : "post"
    },
    "comment-491" : {
      "author" : "MedStudent",
      "comments" : {
        "c_1531642274921" : {
          "content" : "Wow! I wonder what cranial nerves were affected due to the hemorrhage",
          "id" : "c_1531642274921",
          "post_id" : "post-1069",
          "pub_time" : 1531642274922,
          "reply_to" : "comment-491",
          "reply_to_type" : "comment"
        }
      },
      "content" : "The hemorrhage was by the pons and cranial nerve 3 is by the pons, maybe the patient lost the ability to accommodate their eye sight and keep their eyes open.",
      "id" : "comment-491",
      "num_likes" : 0,
      "post_id" : "post-1069",
      "reply_to" : "post-1069",
      "reply_to_type" : "post"
    }
  },
  "content" : "I have a headache",
  "id" : "post-1069",
  "num_comments" : 5,
  "title" : "I have a headache, should I go to the hospital",
}

На данный момент я могу получить начальные комментарии для печати (комментарии, сделанные непосредственно кpost)

func loadComments(){
Database.database().reference().child("main").child("posts").child(postID!).child("comments").queryOrdered(byChild: "id").observeSingleEvent(of: .value, with: { (snapshot:DataSnapshot) in

            if let postsDictionary = snapshot .value as? [String: AnyObject] {


                  for testingkey in postsDictionary.keys {

                    Database.database().reference().child("main").child("posts").child(self.postID!).child("comments").child(testingkey).child("comments").queryOrdered(byChild: "post_id").observeSingleEvent(of: .value, with: { (snapshot:DataSnapshot) in

                         if let postsDictionary = snapshot .value as? [String: AnyObject] {

                            for post in postsDictionary {

                            }
                             DispatchQueue.main.async(execute: {
                            self.TableView.reloadData()
                                })
                        }

                    })
                }
                for post in postsDictionary {
                    //main comments
                    self.Comments.add(post.value)

                }
                 DispatchQueue.main.async(execute: {
                self.TableView.reloadData()
                })

            }
      })
}

Я просто не знаю, как просмотреть каждое сообщение, чтобы проверить, есть ли комментарий, связанный с ним.Также, если есть комментарий, связанный с исходным комментарием, я хочу, чтобы он распечатывался в пользовательской ячейке.

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Я бы создал class или struct для комментария с массивом комментариев в качестве свойства.

class Comment {
    let id: String
    let author: String
    var content: String
    var comments: [Comment]
} 

Тогда я бы создал класс TopLevelComment в качестве подкласса комментария

class TopLevelComment: Comment {
    // Whatever special properties you want your top level comments to have
}

Теперь вы можете проверить, отвечает ли комментарий на сообщение или комментарий, просто используя

comment is TopLevelComment

Затем вы должны соответствующим образом реструктурировать свою базу данных, чтобы вы могли преобразовать ее в Comment класс

. Для вашего tableView я бы использовал представление таблицы для каждого комментария верхнего уровня,может быть, даже раздел для каждого.

0 голосов
/ 17 октября 2018

Что касается вашего вопроса, я полагаю, что вам трудно понять, как анализировать JSON в формате (или модели просмотра), который можно использовать для отображения ваших сообщений и комментариев.

Вы можетеиспользуйте следующий образец модели (с вашими доработками или настройками, если необходимо) для анализа и упорядочения ваших сообщений и комментариев.

class Post {
    var author: String?
    var comments: [Post] = []
    var content: String?
    var id: String?
    var numComments: Int?
    var title: String?

    init(dict: [String: AnyObject]?) {
        author = dict?["author"] as? String
        content = dict?["content"] as? String
        id = dict?["id"] as? String
        numComments = dict?["num_comments"] as? Int
        title = dict?["title"] as? String

        if let commentsDict = dict?["comments"] as? [String: AnyObject] {
            // Sort the comments based on the id which seems to be appended to the comment key.
            let commentIds = commentsDict.keys.sorted()
            for id in commentIds {
                let comment = commentsDict[id] as? [String : AnyObject]
                comments.append(Post(dict: comment))
            }
        }
    }
}

Использование:

//
// postDict is your dictionary object corresponding to one post.
//
// Assign your post's dictionary item to this variable.
//
var postDict: [String: AnyObject]?

// "Post" object which has recursive comments within up to any number of levels.
// Comments are also using the same model object. 
// If you want to use another, you can create one with the corresponding elements.
let post = Post(dict: postDict)

PS: Структура JSON выглядит не уникальной.Возможно, вы захотите переработать эту структуру, чтобы обеспечить аккуратное сопоставление вашего контента.

0 голосов
/ 15 октября 2018

Вы можете создать элемент для элементов комментария.

var commentElements = [CustomStruct]()

После создания пользовательского элемента вытащите переменные из Firebase и сохраните.

if let postsDictionary = snapshot .value as? [String: AnyObject] {

guard let comment = postsDictionary["comments"] as? NSArray else { return }

for com in comment {
    guard let commentObject = com as? [String:Any] else { return }

    let id = commentObject["id"]
    let type = commentObject["reply_to_type"]
    let replyTo = commentObject["reply_to"]
    let content = commentObject["content"]

    let element = CustomStruct(id:id , type:type , ....)
    commentElements.append(element)

}

for post in postsDictionary {

}
 DispatchQueue.main.async(execute: {
self.TableView.reloadData()
    })
}

После извлечения всех элементов вы можете сгруппироватьна основе комментарияИ вы можете показать с Разделом в TableView. Вы сортируете первый элемент "reply_to_type" : "post"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...