在Xcode 9.2中检索Firebase数据库引用时出错

时间:2018-02-26 19:32:08

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

我想尝试使用一些在线教程来制作连接到Firebase的应用,但是它们已经过时,因为它们仍在使用FIRApp.configure()等。因此我必须相应地更改代码而无法完成这种应用程序的可行版本。

到现在为止,我已经:

  1. 通读documentation from Firebase

  2. 如何定义" ref" AppDelegate中的变量(How to fix Firebase SIGABRT crash iOS),

  3. 如何将AppDelegate中的变量设置为全局变量,并在其他ViewControllers(How do I get a reference to the app delegate in Swift?)中可读,

  4. 检查我是否包含了正确的pod文件,并在viewDidLoad部分(Where do I add the database reference from Firebase on iOS?)内设置变量的值,

  5. 注意到可能需要更新pod文件,执行pod崩解和pod更新(Get a database reference in the new Firebase 4.0 release)。

  6. 对于podfile,我已经包含:

    pod 'Firebase/Core'
    pod 'Firebase/Database'
    

    对于AppDelegate,(部分未显示为默认值)

    import UIKit
    import CoreData
    import Firebase
    import FirebaseDatabase //tried not having this line, still the same
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
    
    var window: UIWindow?
    var ref: DatabaseReference!
    
    func application(_application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        FirebaseApp.configure()
        self.ref = Database.database().reference()
        return true
    }
    

    对于ViewController,(未显示的部分是默认的或者当然不相关)

    import UIKit
    import Firebase
    import FirebaseDatabase //again, tried with/without this line
    
    class ViewController: UIViewController {
    
        @IBOutlet weak var emailfield: UITextField!
        @IBOutlet weak var usrnamefield: UITextField!
        @IBOutlet weak var pwdfield: UITextField!
        @IBOutlet weak var loginbtn: UIButton!
        @IBOutlet weak var createnewaccbtn: UIButton!
        @IBOutlet weak var forgetpwdbtn: UIButton!
        //......
        @IBAction func createnewAcc(_ sender: UIButton) {
            let username = usrnamefield.text
            let email = emailfield.text
            let password = pwdfield.text
    
            if username != "" && email != "" && password != "" {
                let appDelegate = UIApplication.shared.delegate as! AppDelegate
                appDelegate.ref.child("users").setValue(["username": username]) //this line is highlighted with the error below
                //Cannot even update one single field to the database
            }
        }
    }
    

    但是当我运行模拟器时,错误显示

    Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
    

    参考:

    Xcode 9.2,CocoaPods 1.4.0,部署目标:9.2,10.3

    更新(2018年2月27日,GMT 18:00):

    尝试直接在databaseReference中定义ViewController变量,并使用databaseReference = Database.database().reference()内的viewDidLoad分配值。

    结果是在AppDelegate(signal SIGABRT行)中收到class AppDelegate。禁用上述值分配代码可解决signal SIGABRT问题,但仍无法连接到Firebase数据库......

1 个答案:

答案 0 :(得分:0)

你在代码中显示的是写入firebase而不是检索。现在重点是,如果你想写,那么首先使用一些常量值,如果工作意味着firebase连接正确,否则文本字段或创建数据库引用问题。有没有理由,不在同一个ViewController中提供你想要在firebase中读写的内容?