【问题标题】:Accessing Firebase data from cell in view controller从视图控制器中的单元格访问 Firebase 数据
【发布时间】:2017-02-23 07:05:20
【问题描述】:

我目前在一个单元格中有一张图片、三个 UILabel 和一个 TextView,并希望在单独的视图控制器中使用这些数据。视图控制器当前通过 push segue 连接到单元格,我应该怎么做才能发生这种情况?

我有这个,但它不起作用:

let uid = FIRAuth.auth()?.currentUser?.uid
    FIRDatabase.database().reference().child("users").child(uid!).observeSingleEvent(of: .value, with: { (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject] {
            self.userLabel.text = dictionary["username"] as? String
        }
    })

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database


    【解决方案1】:

    将字典类型的存储变量添加到源 VC 和目标 VC:var userdata:Dictionary!或者你可以初始化一个空字典 let userdata = String:Any

    然后将快照转换为字典后,将源 VC 用户数据设置为字典数据并执行 segue

    if let dictionary = snapshot.value as? [String: AnyObject] {
        self.userLabel.text = dictionary["username"] as? String
        self.userdata = dictionary
        self.performSegue(withIdentifier: "<segueIDHere>", sender: self)
    }
    

    然后在源VC中实现VC的prepare for segue方法来传递数据:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "<segueIDHere>" {
            let destinationVC = segue.destination as! <ClassNameofVCHere>
            destinationVC.userdata = self.userdata 
        } 
    }
    

    【讨论】:

    • 我应该在 DetailsViewController(分离视图控制器)和 MainViewController 中添加哪些?
    【解决方案2】:

    我实际上能够找到一种方法来做到这一点。其实很简单

    prepareForSegue

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showDetails" {
            if let indexPath = self.postsTableView.indexPathForSelectedRow {
                let post = posts[indexPath.row] as! [String: AnyObject]
                let postDetails = post["postID"] as? String
                let controller = segue.destination as! PostDetailsViewController
                controller.postDetails = postDetails
            }
        }
    }
    

    PostDetailsViewController

    var postDetails: String?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    
        FIRDatabase.database().reference().child("posts").child(postDetails!).observeSingleEvent(of: .value, with: { (snapshot) in
            if let dictionary = snapshot.value as? [String: AnyObject] {
                self.idLabel.text = dictionary["postID"] as? String
            }
        })
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-29
      • 2018-10-22
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      • 1970-01-01
      相关资源
      最近更新 更多