gpt4 book ai didi

ios - 调用注释填充TableView : correcting code errors

转载 作者:行者123 更新时间:2023-11-29 05:39:24 25 4
gpt4 key购买 nike

我正在尝试用我的帖子中的评论填充我的评论表。我有以下数据库结构 JSON:

  {
"posts" : {
"-Lhu-XRs806sXSEQS2BF" : {
"reports" : 0,
"text" : "How can I improve my data structure?",
"timestamp" : 1561120090116,
"title" : "Hello Stack Exchange",
"userID" : "nyRBXSyyDhc1Qkypou0Iz0iMsyr1"
},
"-Lhu-fI6DMSZvy8EdIgM" : {
"reports" : 0,
"text" : "As in Libre",
"timestamp" : 1561120126347,
"title" : "Free",
"userID" : "nyRBXSyyDhc1Qkypou0Iz0iMsyr1"
},
"comments" : {
"-Lhu-hXISy-0N2V4ES-a" : {
"reports" : 0,
"timestamp" : 1561120135594,
"userID" : "nyRBXSyyDhc1Qkypou0Iz0iMsyr1"
},
"-Lhu-j1cR6V407tyUYY1" : {
"reports" : 0,
"timestamp" : 1561120141801,
"userID" : "nyRBXSyyDhc1Qkypou0Iz0iMsyr1"
},
"-Lhu-lrJp9H8SQowlYWz" : {
"reports" : 0,
"timestamp" : 1561120153314,
"userID" : "nyRBXSyyDhc1Qkypou0Iz0iMsyr1"
},
"posts" : {
"-Lhu-XRs806sXSEQS2BF" : {
"comments" : {
"-Lhu-hXISy-0N2V4ES-_" : "How is it going?",
"-Lhu-j1cR6V407tyUYY0" : "It’s good to see you"
}
},
"-Lhu-fI6DMSZvy8EdIgM" : {
"comments" : {
"-Lhu-lrJp9H8SQowlYWy" : "Richard Stallman"
}
}
}
}
}
}

以及以下 Comment 类:

class Comment {
var id:String
var text:String

init(id: String, text:String) {
self.id = id
self.text = text
}
}

这是考虑了您的建议后我的代码:

var comments = [Comment] ()
@IBOutlet weak var commentsTable: UITableView!
@IBOutlet weak var commentPlaceHolder: UILabel!
@IBOutlet weak var newCommentLabel: UITextView!
weak var delegate:NewPostVCDelegate?
let ref = Database.database().reference().child("posts")

@IBAction func reply(_ sender: UIButton) {
let userID = (Auth.auth().currentUser?.uid)!
addComment(toPostId: post!.id, andComment: newCommentLabel.text, commentByUid: userID)
loadComments(forPostId: post!.id)
comments.removeAll()
commentsTable.reloadData()
newCommentLabel.text = String()
commentPlaceHolder.isHidden = false
}

func addComment(toPostId: String, andComment: String, commentByUid: String) {
let commentsRef = self.ref.child("comments") //ref to the comments node
let thisCommentRef = commentsRef.child(toPostId) //ref to a node with postId as key
let commentToAddRef = thisCommentRef.childByAutoId() //each comment will have it's own key
let d = [
"comment_text": andComment,
"comment_by_uid": commentByUid]
commentToAddRef.setValue(d)
}

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
loadComments(forPostId: post!.id)
}

func loadComments(forPostId: String) {
let ref = self.ref.child("comments")
let thisPostRef = ref.child(forPostId)
thisPostRef.observeSingleEvent(of: .value, with: { snapshot in

let allComments = snapshot.children.allObjects as! [DataSnapshot]
for commentSnap in allComments {
let commenterUid = commentSnap.childSnapshot(forPath: "comment_by_uid").value as? String ?? "No uid"
let commentText = commentSnap.childSnapshot(forPath: "comment_text").value as? String ?? "No comment"
let aComment = Comment(id: commenterUid, text: commentText)
self.comments.append(aComment)
print(commenterUid, commentText)
}
self.commentsTable.reloadData()
})
}

func adjustUITextViewHeight(arg : UITextView) {
arg.translatesAutoresizingMaskIntoConstraints = true
arg.sizeToFit()
arg.isScrollEnabled = false
}

override func viewDidLoad() {
super.viewDidLoad()
self.commentsTable.dataSource = self
let cellNib = UINib(nibName: "CommentTableViewCell", bundle: nil)
commentsTable.register(cellNib, forCellReuseIdentifier: "postCell")
view.addSubview(commentsTable)
commentsTable.register(LoadingCell.self, forCellReuseIdentifier: "loadingCell")

self.commentsTable.delegate = self
mainText.isEditable = false
titleText.isEditable = false
commentsTable.register(cellNib, forCellReuseIdentifier: "postCell")
view.addSubview(commentsTable)
commentsTable.register(LoadingCell.self, forCellReuseIdentifier: "loadingCell")
print(delegate!)
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return comments.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.section == 0 {
let cell = tableView.dequeueReusableCell(withIdentifier: "postCell", for: indexPath) as! CommentTableViewCell
cell.set(comment: comments[indexPath.row])
return cell
} else {
let cell = tableView.dequeueReusableCell(withIdentifier: "loadingCell", for: indexPath) as! LoadingCell
cell.spinner.startAnimating()
return cell
}
}

func textViewDidChange(_ commentView: UITextView) {
commentPlaceHolder.isHidden = !newCommentLabel.text.isEmpty
}

结合杰伊的评论,我开始运行 View 。我必须添加comments.removAll(),这样它就不会在commentsTable中多次打印出评论。但是,func textViewDidChange 不再起作用。我不知道如何解决这个问题。我尝试调用该函数,但没有成功。也许委托(delegate)变更影响了这一点?

最佳答案

此答案基于问题中的数据以及后续评论。

非规范化数据是 NoSQL 数据库中的标准做法,但在这种情况下,问题中的结构可能比所需的更复杂。

问题来了

Given a series of posts where each post has comments, how do you load the comments for each post to be displayed in a tableView.

我将从提议的结构开始逆向工作

posts
post_0 //created with .childByAutoId
creator_uid: "the uid of whoever created this post"
post_title: "My post about posting"

comments
post_0 //ties back to the key of the post in the posts node
comment_0 //created with .childByAutoId
comment_by_uid: "whoever created this comment"
comment_text: "comment about this post"
comment_1
comment_by_uid: "whoever created this comment"
comment_text: "comment about this post"

此结构将评论与它们引用的帖子分开。在 comments 节点中,每个节点的关键是 posts 节点中的 post_id。这允许将帖子加载到 tableView 中,而不会产生大量开销,例如,如果您在详细 View 中显示评论,则加载特定帖子的所有评论。

请注意,帖子节点和评论节点键是使用 .childByAutoId() 创建的

现在是工作流程。假设用户正在创建新帖子并输入了帖子标题和其他信息。调用此函数可在 Firebase 中创建帖子。

func createPost(withTitle: String, andCreatorUid: String) {
let postsRef = self.ref.child("posts")
let thisPost = postsRef.childByAutoId()
let d = [
"post_title": withTitle,
"creator_uid": andCreatorUid
]
thisPost.setValue(d)
}

这里有一个棘手的地方 - 我所做的是有一个 posts 节点的观察者。添加新帖子时,我会收到该事件,创建一个包含有关该帖子的信息的 PostsClass 对象,并将其添加到我的 dataSource 数组中,然后刷新我的 tableView。通过这样做,我还获得了节点的 key (它是使用 .childByAutoId 创建的)。

另一位用户看到该帖子并想要对其发表评论,因此他们点击该帖子以输入评论。以下代码将他们的评论存储在 Firebase 中。

func addComment(toPostId: String, andComment: String, commentByUid: String) {
let commentsRef = self.ref.child("comments") //ref to the comments node
let thisCommentRef = commentsRef.child(toPostId) //ref to a node with postId as key
let commentToAddRef = thisCommentRef.childByAutoId() //each comment will have it's own key
let d = [
"comment_text": andComment,
"comment_by_uid": commentByUid]
commentToAddRef.setValue(d)
}

toPostId 是帖子的关键,它是从他们选择添加评论的 PostClass 对象获取的。

最后,为了专门回答这个问题,这里加载了特定帖子的评论。

func loadComments(forPostId: String) {
let ref = self.ref.child("comments")
let thisPostRef = ref.child(forPostId)
thisPostRef.observeSingleEvent(of: .value, with: { snapshot in

let allComments = snapshot.children.allObjects as! [DataSnapshot]
for commentSnap in allComments {
let commenterUid = commentSnap.childSnapshot(forPath: "comment_by_uid").value as? String ?? "No uid"
let commentText = commentSnap.childSnapshot(forPath: "comment_text").value as? String ?? "No comment"
//create a commentClass object, update properties and add to dataSourceArray
print(commenterUid, commentText)
}
//tableView reload
})
}

注意事项:

我有一个类 var,ref,因此 self.ref 指向我的根 Firebase 节点。您需要将其设置为指向您的

我在此答案中使用 post_0 和 comment_0 作为节点键名称,因为它比 -LhzJD3tPL0xcnUDMaOZ 这样的键更容易阅读和理解,而 .childByAutoId 将在您的 Firebase 中实际创建。

关于ios - 调用注释填充TableView : correcting code errors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56704745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com