2016-05-14 36 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