我的数组索引路径有问题?斯威夫特4火力基地



我不知道如何恰当地描述我的问题,但这就是出了什么问题。

所以我有一个 TableView,里面填充了用户上传的posts,但我知道我想让我的用户能够对彼此的帖子发表评论,当他们点击帖子时,他们会看到一个新的 ViewController,其中包含他们点击的帖子中的数据。 我已经做到了,所以这不是问题。但问题是,当他们点击一个索引路径时,无论它是什么,它都是被点击的相同索引。因此,例如,如果有 3 个帖子,并且名为test 1test 2test 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
}
}

最新更新