Ios 调试聊天应用程序

Ios 调试聊天应用程序,ios,swift,debugging,firebase,Ios,Swift,Debugging,Firebase,我用Firebase制作了这个简单的聊天应用程序,上面有最后一条消息,但我一直遇到这个错误,似乎无法克服它。我已经检查了很多东西,比如@IBOutlets,但我似乎无法解决问题。有人能帮我修复“致命错误:在打开可选文件时意外发现零”。问题是,我似乎找不到任何选项开始,因为一切都只是它的常规数据类型,或者像@IBOutlets一样被降级。下面是我为其中一个视图控制器编写的代码:导致应用程序崩溃的控制器。任何帮助都是很好的,或者建议你朝哪个方向前进。谢谢大家! import UIKit import

我用Firebase制作了这个简单的聊天应用程序,上面有最后一条消息,但我一直遇到这个错误,似乎无法克服它。我已经检查了很多东西,比如@IBOutlets,但我似乎无法解决问题。有人能帮我修复“致命错误:在打开可选文件时意外发现零”。问题是,我似乎找不到任何选项开始,因为一切都只是它的常规数据类型,或者像@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)

    }

}
导入UIKit
进口火基
类ViewTwo:UIViewController{
var ref:Firebase!
var REF:Firebase!
@IBOutlet弱var readMsg:UILabel!
@IBOutlet弱var msg:UITextField!
@IBVAR名称字段:UITextField!
@iAction func sendMsg(发件人:AnyObject){
nameField.resignFirstResponder()辞职
如果nameField.text==“ETHAN”{
ref=Firebase(url:“我的应用程序/Person1Msg”)
ref.setValue(“\(msg.text)”)
REF=REF
}如果nameField.text==“CHASE”,则为else{
ref=Firebase(url:“我的应用程序/Person2Msg”)
ref.setValue(“\(msg.text)”)
REF=REF
}否则{
msg.placeholder=“请输入所有大写字母的名称”
}
}
覆盖功能视图显示(动画:Bool){
中的REF.observeEventType(.Value){(snap:FDataSnapshot!)
self.readMsg.text=snap.value as?字符串
}
}
覆盖功能触摸开始(触摸:设置,withEvent事件:UIEvent?){
self.view.endEditing(true)
}
}
以下是my other(也是唯一的其他视图控制器)中的代码,但未发现任何错误:

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

    }
}
类ViewController:UIViewController{
接受变量:Bool=false
@IBVAR名称字段:UITextField!
@iAction func submit(发件人:AnyObject){
nameField.resignFirstResponder()辞职
如果nameField.text==“CHASE”| | nameField.text==“ETHAN”{
已接受=真
}否则{
nameField.placeholder=“请输入所有大写字母的正确名称”
}
}
@iAction func启动(发送方:AnyObject){
nameField.resignFirstResponder()辞职
如果接受==真{
让故事板:UIStoryboard=UIStoryboard(名称:“Main”,bundle:nil)
让nextViewController:UIViewController=storyboard.InstanceEviewControllerWithiIdentifier(“ViewTwo”)作为UIViewController
self.presentViewController(nextViewController,动画:true,完成:nil)
}否则{
}
}
覆盖功能触摸开始(触摸:设置,withEvent事件:UIEvent?){
self.view.endEditing(true)
}
重写func viewDidLoad(){
super.viewDidLoad()
已接受=错误
}
}

根据您的代码,
var-ref:Firebase,ref需要一个值。但是,在条件语句中,红色可能没有值。在viewDidLoad的最后一个else语句中,Xcode致命地发现ref为nil。尝试分配
var ref=Firebase(url:)https://yourappurl.firebaseio.com“
在您的条件之前。

在ViewTwo类中,在ViewDidAspect函数中,有一个尚未完全定义的引用:

REF.observeEventType(.Value)
此时,REF仅定义为REF:Firebase

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

在调用sendMsg func之前,REF没有完全定义

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

override func viewDidAppear(animated: Bool) {

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

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

您是否尝试设置异常断点以查看异常发生的位置?是。这里就是这行代码:“@IBOutlet弱变量nameField:UITextField!”因此,当我稍后调用“nameField”时,它在某个地方找到了nil。我就是找不到地方。谢谢。所以那个插座还没设好。如何创建视图控制器?你是否曾经在不使用情节提要的情况下创建过一个实例?如果没有设置,我的意思是它为零。由于它是隐式展开的可选项,因此exception@EQOxx123这不是一个正确的答案。将ref设置为这个答案中提到的内容,将在视图加载后立即读取Firebase中所有内容的全部内容;所有节点、子节点等都可能是大量数据。然后,它将获取潜在的巨大数据集,并将其向下转换为字符串,该字符串将在某个点崩溃。你的问题比这个答案涉及的问题要多得多。