【问题标题】:How do I get Firebase database value into UILabel text?如何将 Firebase 数据库值转换为 UILabel 文本?
【发布时间】:2017-07-30 20:53:04
【问题描述】:

我正在尝试从我的 Firebase 数据库中读取一个值。然后我想将 UILabel 文本更改为数据库子值。看起来很简单,但我无法弄清楚为什么值是空白。

这是我的 Firebase JSON:

{
  "pilots" : {
    "HpPzn0XUqMgsKhUOpH75lHIhyFA3" : {
      "pilot" : "First Lastname",
      "weight" : 180
    }
  }
}

以下是 Firebase 规则,目前仅用于测试:

{
  "rules": {
    "pilots": {
        ".read": true,
        ".write": true

    }
   }
 }

最后是 Swift 3 代码,这可能是丑陋的罪过。阅读和在线课程后的第一个应用程序。

import UIKit
import Firebase
import FirebaseCore
import FirebaseAuth
import FirebaseDatabase

class MainMenuViewController: UIViewController {


@IBOutlet weak var pilotUsername: UILabel!
@IBOutlet weak var dateTime: UILabel!
@IBOutlet weak var aircraftLabel: UILabel!
@IBOutlet weak var riskScoreInt: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    let ref = FIRDatabase.database().reference()
    let userID = FIRAuth.auth()?.currentUser?.uid

    ref.child("pilots").child(userID!).child("pilot").observeSingleEvent(of: .value, with: { (snapshot) in

        // Get user value
        let value = snapshot.value as? NSDictionary
        let username = value?["username"] as? String ?? ""

        self.pilotUsername.text = username

        print(username)
        // ...
    }) { (error) in
        print(error.localizedDescription)
    }





}
}

我只是使用 Firebase 文档中的示例代码。在

之后有一行代码(在示例中)
let username = value?["username"] as? String ?? ""

那就是:

let user = User.init(username: username)

但它给了我一个错误。 “使用未解析的标识符‘用户’”

我认为我不需要那行代码,因为在我遵循的示例和课程中没有使用类似的代码。

提前致谢。这是我第一次在 Stack Overflow 上发帖。

【问题讨论】:

  • 你需要创建一个User

标签: ios firebase swift3 firebase-realtime-database


【解决方案1】:
import FirebaseDatabase

class User {

    // MARK: Properties

    var firstname: String
    var lastname: String
    var username: String { return "\(firstname)\(lastname)" }

    // MARK: Initializers

    init(firstname: String, lastname: String) {

        self.firstname = firstname
        self.lastname = lastname
    }

    init?(snapshot: FIRDataSnapshot) {

        guard
            let firstname = snapshot.childSnapshot(forPath: "First").value as? String,
            let lastname = snapshot.childSnapshot(forPath: "Lastname").value as? String
        else { return nil }

        self.firstname = firstname
        self.lastname = lastname
    }
}

然后

ref.child("pilots").child(userID!).child("pilot").observeSingleEvent(of: .value, with: { [weak self] (snapshot) in

    if let user = User(snapshot: snapshot) {

        self?.pilotUsername.text = user.username
    }

}) { (error) in

    print(error.localizedDescription)
}

【讨论】:

  • 好的,我已经创建了用户类,但是你的第二个代码块让我有点困惑。我得到一个“价值'用户'已定义但从未使用过”的警告。 UILabel 仍然没有改变。我已经尝试替换我以前的代码,并留下一些,但我得到构建失败。
  • 是的,我忘了加self?.pilotUsername.text = user.username
  • 没有更多错误! UILabel 仍然没有改变,所以很奇怪。在guard let username = snapshot.childSnapshot(forPath: "username").value as? String else { 行中,我尝试将 forPath: 更改为 Pilots 和 Pilot,但这似乎并没有什么不同。
  • 在你User(snapshot: snapshot)之前,打印出快照并显示结果
  • 这是最后一位启用登录尝试登录成功快照(试点)第一姓所以它从数据库中的正确位置获取快照,但 UILabel 不是t 正在改变...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 2011-03-12
  • 1970-01-01
  • 2015-06-13
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多