2016-07-15 3 views
-1

さて、基本的に私はBackendlessとFirebaseでチャットを作成する方法についてのudemyのチュートリアルに従っています。しかし、私は2つのプロバイダに依存したくないので、Backendlessを使用しない方が好きです。そのため、私はFirebaseだけに固執したいと思います。したがって、私は現在自分のコードをFirebaseに変換しています。Swiftの奇妙なオプションエラー

私はそれぞれのUIDに固有のページを表示するView Controllerを持っています。 UIDはStringとして保存され、別のテーブルビューコントローラからセグに割り当てられます(これはうまくいきます)。その後、UIDを使用して、ユーザーから必要なデータを取得します。新しいチャットを作成するはずの「チャット開始」ボタンがあります。

このチュートリアルでは、チューターが別のビューコントローラから別の機能を起動するプロトコル(デリゲート)を設定しました。

protocol ChooseUserDelegate { 
    func createChatroom(withUser: String) 
} 

var delegate: ChooseUserDelegate! 

と私のチャット@IBActionで、私はこのコードを持っている:

@IBAction func StartChat(sender: AnyObject) { 

    let userID = uid 
    if let theId = userID as? String { 
     delegate.createChat(String(theId)) 
    } 

} 

を(上記のコードは、すべて同じVCである。)これは、次のようになります。 createChat()関数が格納されている別のビューコントローラで

、次のコードである。

class AnotherVC UIViewController, UITableViewDelegate, UITableViewDataSource, ChooseUserDelegate{ 

    func createChat(withUser: String) { 

     print(withUser) 

    } 

} 

問題がオンため任意エラー(アンラップ)から、私はcreateChat()を呼び出すために得ることができないということですdelegate.createChat(String(theId))

編集:入力があってもエラーが発生します。私は今本当に混乱しています。私の代議員と何か間違っていますか?

+0

デリゲート変数の宣言を確認してください。 –

+0

@RohitKP私が心配する限り、それは正しいです。私はより多くのコードで自分の投稿を更新することができます。 – askaale

+2

質問を判読できるように書式設定してください。 – matt

答えて

0
if let theId = userID { 
    delegate.createChat(String(theId)) 
} 
+0

条件付きバインディングにはオプションのタイプ(?)が必要です。そのため、これは動作しません:/ – askaale

+0

助けてくれてありがとう。心から感謝する!私自身もそれを理解することはできない。 – askaale

+0

私の更新された回答を確認してください – chengsam

2

オプションであり、コードの一部のみが(あなたが正しくuserIDをアンラップので)delegateです。したがって、delegatenilであるためにエラーが発生する必要があります。 StartChat()を呼び出す前にdelegateに設定してください。

var delegate: ChooseUserDelegate!はデリゲートを初期化しません。 ChooseUserDelegate!と書くと、delegate変数のタイプのみが定義されます。自動的にnilに設定されます。あなたのコードをクリーンアップすることができ、いくつかの他の方法があります

var delegate: ChooseUserDelegate! = ChooseUserDelegate() 

ChooseUserDelegateの新しいインスタンスを初期化するにはあなたのような何かを書く必要があるだろう。メソッド名はCamelCaseではなくllamaCaseである必要があります。StartChat()からstartChat()に名前を変更する必要があります(インタフェースビルダーで再接続してください)。そのメソッドの本体には、同じ変数の3つの異なる名前、uidがあります。それがどれほどシンプルかを確認してください。

+0

言及するもう1つの事柄は、プロトコルのメソッドでなければなりません: 'func createChat(withUser:String)' – chengsam

+0

I私のメインクラスの下で(上に)デリゲートを初期化しました。 – askaale

+0

@askaaleデリゲートを印刷して、それがゼロかどうかを確認することができます – chengsam