我不知道如何恰当地描述我的问题,但这就是出了什么问题。
所以我有一个 TableView,里面填充了用户上传的posts
,但我知道我想让我的用户能够对彼此的帖子发表评论,当他们点击帖子时,他们会看到一个新的 ViewController,其中包含他们点击的帖子中的数据。 我已经做到了,所以这不是问题。但问题是,当他们点击一个索引路径时,无论它是什么,它都是被点击的相同索引。因此,例如,如果有 3 个帖子,并且名为test 1
、test 2
和test 3
那么他们点击的任何帖子都是呈现的最新帖子,因此在这种情况下,它总是test 3
呈现。那么,新的视图控制器是如何呈现它们的呢?所有posts
都使用FirebaseDatabase自动生成的ID上传和存储。
所以我使用此代码来获取自动生成的 ID 并将其传递给全局变量并将其传递给DetailViewController
:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let post = posts[indexPath.row]
performSegue(withIdentifier: "CommentSegue", sender: post)
Database.database().reference().child("posts").observe( .value) { (snapshot) in
for child in snapshot.children {
let snap = child as! DataSnapshot
let key = snap.key
postsKey = key
}
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "CommentSegue"{
let commentVC = segue.destination as! CommentViewController
commentVC.post = (sender as? NSDictionary?)!
}
}
我正在使用这种方法删除帖子,并且工作正常,但仅此而已,因此我尝试发送数据的方式可能存在问题,或者我可能以错误的方式将帖子附加到帖子数组。
它在 CommentViewController 中看起来像这样:
import UIKit
import FirebaseDatabase
import FirebaseStorage
import FirebaseAuth
import FirebaseCore
import Firebase
class CommentViewController: UIViewController {
var post: NSDictionary?
// var comments: [NSDictionary] = []
let postKey = postsKey
@IBOutlet weak var titeLabel: UILabel!
override func viewDidAppear(_ animated: Bool) {
loadData()
}
func loadData() {
print(postKey)
Database.database().reference().child("posts").child(postKey).observeSingleEvent(of: .value) { (snapshot) in
if let dict = snapshot.value as? [String: AnyObject] {
self.titeLabel.text = dict["title"] as? String
}
}
}
谢谢你的时间。
首先,使用sender
可能会造成混淆;通常发送者是导致事件的人,而不是正在传输的任意数据。
我会用这个来改进你的代码:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
performSegue(withIdentifier: "CommentSegue", sender: tableView)
// ...
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "CommentSegue"{
guard let commentVC = segue.destination as? CommentViewController else { return }
guard let tableView = sender as? UITableView else { return }
guard let selectedRow = tableView.indexPathForSelectedRow?.row else { return }
let post = posts[selectedRow]
print("Selected: (post)")
commentVC.post = post
}
}
现在,根据按下的行检查prepare(for:sender:)
中的post
是否具有正确的值(它应该)(观看 print 语句的输出)
如果post
始终正确,则CommentViewController
可能不会相应地更新UI(可能仅在第一次),因此请检查其中的viewDidLoad
/viewDidAppear
功能。也许你也应该在这里发布它的代码。
更新
我认为您需要从CommentViewController
中提供的post
字典中获取帖子的数据库密钥,可能是这样的:
func loadData() {
postKey = post["key"] // or something else, you'll need to fetch the data base key from the current dictionary
Database.database().reference().child("posts").child(postKey).observeSingleEvent(of: .value) { (snapshot) in
if let dict = snapshot.value as? [String: AnyObject] {
self.titeLabel.text = dict["title"] as? String
}
}