调试聊天应用

时间:2016-05-14 22:25:39

标签: ios swift debugging firebase

我使用Firebase使用最后一条消息创建了这个简单的聊天应用程序,但我一直遇到此错误,似乎无法通过它。我检查了许多像@IBOutlets这样的东西,但我似乎无法解决问题。任何人都可以帮我修复"致命错误:在打开一个可选的"时,意外地发现了nil。问题是,我似乎无法找到任何可选项开始,因为一切都只是它的常规数据类型或者像@IBOutlets一样被低估了。下面是我的一个视图控制器的代码:导致应用程序崩溃的代码。任何帮助都会很棒或者建议指导方向。谢谢!

import UIKit
import Firebase
class ViewTwo : UIViewController {

    var ref: Firebase!

    var REF: Firebase!

    @IBOutlet weak var readMsg: UILabel!

    @IBOutlet weak var msg: UITextField!

    @IBOutlet weak var nameField: UITextField!

    @IBAction func sendMsg(sender: AnyObject) {

        nameField.resignFirstResponder()

        if nameField.text == "ETHAN" {

            ref = Firebase(url: "my-app/Person1Msg")

            ref.setValue("\(msg.text)")

            REF = ref

        } else if nameField.text == "CHASE" {

            ref = Firebase(url: "my-app/Person2Msg")

            ref.setValue("\(msg.text)")

            REF = ref

        } else {

            msg.placeholder = "Please enter name ALL CAPS"

        }

    }

    override func viewDidAppear(animated: Bool) {

        REF.observeEventType(.Value) { (snap: FDataSnapshot!) in

            self.readMsg.text = snap.value as? String

        }

    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

        self.view.endEditing(true)

    }

}

这是我的另一个和唯一的其他视图控制器内的代码,但没有找到错误:

class ViewController : UIViewController {

    var accepted: Bool = false

    @IBOutlet weak var nameField: UITextField!

    @IBAction func submit(sender: AnyObject) {

        nameField.resignFirstResponder()

        if nameField.text == "CHASE" || nameField.text == "ETHAN" {

            accepted = true

        } else {

            nameField.placeholder = "Please enter correct name ALL CAPS"

        }

    }

    @IBAction func start(sender: AnyObject) {

        nameField.resignFirstResponder()

        if accepted == true {

            let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

            let nextViewController : UIViewController = storyboard.instantiateViewControllerWithIdentifier("ViewTwo") as UIViewController

            self.presentViewController(nextViewController, animated: true, completion: nil)

        } else {



        }

    }
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

        self.view.endEditing(true)

    }
    override func viewDidLoad() {

        super.viewDidLoad()

        accepted = false

    }
}

2 个答案:

答案 0 :(得分:1)

在ViewTwo类中,在viewDidAppear func中,有一个尚未完全定义的REF:

override func viewDidAppear(animated: Bool) {

    REF.observeEventType(.Value) { (snap: FDataSnapshot!) in

        if let msg = snapshot.value as? String {
           self.readMsg.text = msg
        }
    }
}

此时,REF仅定义为REF:Firebase!。

因此,当视图出现时,它将尝试为没有引用的REF调用observeEvent。

在调用sendMsg函数之前,REF尚未完全定义。

此外,您可能希望在readMsg分配中添加一些错误检查:

enum

答案 1 :(得分:0)

根据您的代码var ref: Firebase!,ref需要一个值。但是,在条件语句中,红色可能没有值。在你的viewDidLoad的最后一个声明中,Xcode致命地发现ref为零。尝试在条件之前指定var ref = Firebase(url:"https://yourappurl.firebaseio.com")