2016-05-14 4 views
1

Firebaseを使用した最後のメッセージでこの簡単なチャットアプリを作ったが、このエラーが発生していて、それを過ぎているようには見えない。私は@ IBOutletsのような多くのものをチェックしましたが、問題を解決することはできません。誰も私が "致命的なエラーを修正するのを助けることができます:オプションのアンラップ中に予期せずnilが見つかりました"。問題は、すべての標準データ型であるか、@IBOutletsのようにダウンキャストされているからです。以下はビューコントローラの1つのコードです:アプリケーションをクラッシュさせているもの。どんな助けも、どんな方向に向かうべきかのアドバイスとなるでしょう。ありがとうございました!ここでチャットアプリケーションのデバッグ

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 weak var nameField:UITextField!' – EQOxx123

+0

それで、後で 'nameField'を呼び出すとどこかでnilが見つかる。私はどこで見つけることができません。ありがとう。 – EQOxx123

答えて

1

は、viewDidAppearのFUNCで、完全に定義されていないREFがありますFirebaseは!

ビューが表示されると、refを持たないREFに対してobserveEventを呼び出そうとします。

REFは、sendMsg funcが呼び出されるまで完全に定義されていません。

また、あなたはあなたの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!によると、refは値を必要とします。ただし、条件文では、赤は値を持たない可能性があります。 viewDidLoadの最後のelseステートメントでは、Xcodeはrefがnilであることを致命的に検出します。条件の前にvar ref = Firebase(url:"https://yourappurl.firebaseio.com")を割り当ててみてください。

REF.observeEventType(.Value) 

をし、その時点で、REFのみREF次のように定義されます:ViewTwoクラスで

+0

@ EQOxx123これは正解ではありません。この回答に記載されているものにrefを設定すると、ビューが読み込まれるとすぐにFirebaseのすべての内容がすべて読み込まれます。すべてのノード、子どもなどが含まれ、膨大な量のデータになる可能性があります。その潜在的な巨大なデータセットを取り込み、ある時点でクラッシュする文字列を落とします。あなたの質問には、この回答のアドレスよりもずっと多くの問題があります。 – Jay

関連する問題