我不确定如何恰当地描述我的问题但是这里出了什么问题。
所以我有一个填充了posts
用户上传的TableView,但我知道我想让我的用户以他们点击A帖子的方式对每个其他帖子发表评论,然后他们会看到一个新的ViewController仅包含来自他们点击的帖子的数据。我已经管理好这不是问题所在。但问题是,当他们单击一个indexPath时,它总是与Clicked相同的索引。例如,如果有3个帖子,并且名为test 1
,test 2
和test 3
,那么他们点击它的帖子总是最新的帖子,因此在此显示情况下,它始终是test 3
。那么他们如何呈现新的viewController?所有posts
都已上传,并使用FirebaseDatabase生成的自动生成ID进行存储。
所以我使用此代码获取AutoGenerated 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?)!
}
}
我正是使用这种方法来删除帖子并且工作得非常好,但这只是没有,所以可能会有一个问题,我是如何尝试发送数据的,或者我可能会这样做。 m以错误的方式将帖子附加到posts数组。
在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
}
}
}
感谢您的时间。
答案 0 :(得分:1)
首先,使用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
}
}
现在,根据按下的行检查post
中的prepare(for:sender:)
是否具有正确的值(应该是这样)(观察打印语句的输出)
如果post
始终正确,则CommentViewController
可能无法正确更新用户界面(可能仅在第一次),因此请检查viewDidLoad
/ {{1}那里的功能。也许你也应该在这里发布它的代码。
<强>更新强>
我认为您需要从viewDidAppear
中提供的post
字典中获取帖子的数据库密钥,可能是这样的:
CommentViewController