2016-05-14 37 views
1

我已经使用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) 

    } 

} 

这是我等只有其他视图控制器内的代码,但没有发现错误:

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

您是否尝试过设置一个异常断点,看看那里发生异常 – Paulw11

+0

是。这是这行代码:'@IBOutlet弱var nameField:UITextField!' – EQOxx123

+0

因此,稍后当我打电话给'nameField'时,它会找到某处。我只是找不到在哪里。谢谢。 – EQOxx123

回答

1

在ViewTwo类,在viewDidAppear FUNC,有尚未完全定义的REF:

REF.observeEventType(.Value) 

,并在这一点上,楼盘定义为只REF:火力地堡!

因此,当视图出现时,它会尝试调用不具有参考的REF的observeEvent。

直到sendMsg函数被调用,REF才被完全定义。

此外,您可能需要添加一些错误在你readMsg分配核对:

override func viewDidAppear(animated: Bool) { 

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

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

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

+0

@ EQOxx123这不是一个正确的答案。设置参考答案中提到的内容,一旦视图加载,请阅读Firebase中所有内容的全部内容;所有节点,孩子等,这可能是一个巨大的数据量。然后,它会采取这个潜在巨大的数据集并将其向下转换为一个字符串,这会在某个时候崩溃。问题中的问题比这个问题的答案多得多。 – Jay