2016-10-01 12 views
0

私は非常に基本的なユーザークラスを持っています。Firebaseからユーザーデータを取得し、必要に応じて現在の画面を更新します。Swift 2.3からSwift 3.0への更新後にクラスプロトコルが動作しない

class FirstViewController: UIViewController, userClassProtocol { 
    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     print("View will load") 
     User.sharedInstance.delegate = self 
    } 

    func updateScreen() { 
     print("Screen is going to update") 
     //Do stuff here 
    } 
} 

私はここから取得するログは、次のとおりです:スウィフト3.0

にこれはViewControllerをユーザクラス

@objc protocol userClassProtocol { 
     func updateScreen() 
     @objc optional func sucessUnlockedCategory() 
    } 

class User { 
    static let sharedInstance = User() 
    internal var delegate : userClassProtocol? 

    func fakeClassThatGetsDataFromFirebase() { 
     //Got data 
     print("Has new data") 
     self.delegate?.updateScreen() 
    } 
} 

されており、ここにある 新しいデータがあります ビューが表示されます

しかし、ビューコントローラの関数updateScreen()は呼び出されません。 Xcodeはエラーを指摘していません。

+0

デリゲートを設定した後、fakeClassThatGetsDataFromFirebaseを呼び出しますか? –

答えて

1

あなたのメソッド呼び出しのタイミングに問題があるようです。

fakeClassThatGetsDataFromFirebaseメソッドが最初に呼び出され、その時点でデリゲートが設定されていません。 nil呼び出したときにself.delegateをされています

self.delegate?.updateScreen()

をごviewWillAppearfakeClassThatGetsDataFromFirebase

+0

あなたは何かにいる、私はfakeClassThatGetsDataFromFirebaseをトリガーするボタンのコードを変更してUser.sharedInstance.delegate = selfを呼び出す前に、その関数を呼び出すと、これはまったく同じコードが(Swift 2.3)理論的にはviewWillAppearは毎回fakeClassThatGetsDataFromFirebaseの前に呼び出されています。 –

+0

私は、あなたのSwift 3変換の何かが、物事がどのように呼び出されるかの順序を乱している可能性があると思います。おそらく、あなたはデリゲートを 'FirstViewController'のinitメソッドに設定するか、少なくともコールチェーンを' viewDidLoad'に設定する必要があります。 – kleezy

+0

これは物事の底を知るのに役立ちましたか?もしそうなら、答えを受け入れてください。 – kleezy

0

前に呼び出される場合にのみ動作しますそれはあなたのコードによると、呼び出されるべきではありません。何もと呼びます。これは、代理人メソッドでupdateScreen()と呼ぶべきものです。

+0

fakeClassThaGetsDataFromFirebaseは、Firebaseデータベースのデータに変更が加えられるたびに呼び出されます。サイズが大きいためにコードを入れませんでしたが、機能の中にプリント(「新しいデータがあります」)が表示されます。 –

関連する問題