我的Array的IndexPath出了什么问题? swift 4 Firebase

时间:2018-01-11 13:22:13

标签: ios arrays swift firebase firebase-realtime-database

我不确定如何恰当地描述我的问题但是这里出了什么问题。

所以我有一个填充了posts用户上传的TableView,但我知道我想让我的用户以他们点击A帖子的方式对每个其他帖子发表评论,然后他们会看到一个新的ViewController仅包含来自他们点击的帖子的数据。我已经管理好这不是问题所在。但问题是,当他们单击一个indexPath时,它总是与Clicked相同的索引。例如,如果有3个帖子,并且名为test 1test 2test 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


        }
    }
}

感谢您的时间。

1 个答案:

答案 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