2016-05-14 7 views
1

Ich habe diese einfache Chat-App mit der letzten Nachricht mit Firebase gemacht, aber ich laufe weiter in diesen Fehler und kann nicht scheinen, darüber hinaus zu kommen. Ich habe viele Dinge wie die @IBOutlets überprüft, aber ich kann das Problem nicht lösen. Kann mir jemand helfen, "Fatal Error: Unerwarteterweise gefunden Null beim Auspacken eines optionalen". Das Problem ist, dass ich scheinbar keine Optionen finden kann, mit denen ich anfangen kann, denn alles ist nur der normale Datentyp oder wurde wie die @IBOutlets niedergeschlagen. Unten ist mein Code für einen der View-Controller: Der, der die App zum Absturz bringt. Jede Hilfe wäre großartig oder ein Ratschlag, in welche Richtung man gehen soll. Vielen Dank!Debugging Chat App

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) 

    } 

} 

Hier ist der Code innerhalb meiner anderen und nur andere View-Controller, aber keine Fehler gefunden:

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

Haben Sie eine Ausnahme Haltepunkt versucht Einstellung zu sehen, wo die Ausnahme – Paulw11

+0

tritt auf Ja. Es ist diese Codezeile hier: '@IBOutlet weak var nameField: UITextField!' – EQOxx123

+0

So findet es irgendwo keinen Fehler, wenn ich 'nameField' später anrufe. Ich kann einfach nicht wo finden. Vielen Dank. – EQOxx123

Antwort

1

In der ViewTwo Klasse, in der viewDidAppear func, gibt es einen REF, die nicht vollständig definiert: Firebase !.:

REF.observeEventType(.Value) 

und an diesem Punkt wird REF nur als REF definiert

Wenn also die Ansicht angezeigt wird, wird versucht, observeEvent für REF aufzurufen, das keinen Verweis enthält.

REF ist erst vollständig definiert, wenn sendMsg func aufgerufen wird.

Auch können Sie einige Fehlerprüfung in Ihrem ReadMSG Zuordnung hinzufügen möchten:

override func viewDidAppear(animated: Bool) { 

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

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

nach Ihren Code, var ref: Firebase! einen Wert benötigt ref. In Ihren bedingten Anweisungen kann Rot jedoch keinen Wert haben. In Ihrer letzten else-Anweisung von viewDidLoad findet Xcode fatal, dass ref null ist. Versuchen Sie, var ref = Firebase(url:"https://yourappurl.firebaseio.com") vor Ihren Bedingungen zuzuweisen.

+0

@ EQOxx123 Dies ist keine korrekte Antwort. Wenn Sie den Verweis auf das in dieser Antwort Erwähnte einstellen, lesen Sie, sobald die Ansicht geladen wird, den gesamten Inhalt von allem in Ihrem Firebase; alle Knoten, Kinder usw. und das könnte eine riesige Menge an Daten sein. Dann wird es diesen potentiell gigantischen Datensatz nehmen und ihn um eine Zeichenkette reduzieren, die irgendwann abstürzen wird. Es gibt eine Menge mehr zu dem Problem in Ihrer Frage als diese Antwort adressiert. – Jay