2017-03-09 5 views
0

メインコントローラに次のコードをロードしています。 WebPortalViewControllerを問題なく呼び出していることを確認するためにデバッグしました。instantiateViewControllerWithIdentifierはクロージャ内でインスタンスを維持しません

親コントローラA.viewDidLoad()

let sponsorViewController:UIViewController = storyboard!.instantiateViewControllerWithIdentifier("Child") 
    childViewController.view.setNeedsLayout() 
    childViewController.view.layoutIfNeeded() 

問題は、のviewDidLoad機能が動作コール

子コントローラB.viewDidload()

の実行に依存していることがあります
let operation = GetActiveSubscriptionOperation() 

    operation.getActiveSubscriptionCompletionBlock = { [weak self] (subscription, error) in 

     switch (self, subscription, error) { 

selfは、t彼はControllerがUITabControllerから直接ロードされることを見ます。閉鎖中にselfを維持するためにgetActiveSubscriptionCompletionBlockを取得するにはどうすればよいですか?

+0

あなたはコードの完全なコンテキストを表示していませんが、 'let sponsorViewController ...'がある関数の中にあると仮定します。その関数が終了すると、 'let'変数は範囲外になります。クロージャーは「弱い自己」を使用しているので、それはビューコントローラーを保持するのに十分ではないため、解放されます。あなたのタブコントローラによってロードされるView Controllerのインスタンスは、別のインスタンスです。 – Paulw11

+0

残念ながら、ClosureはServerOperationのcallbackQueue.addOperationWithBlockのコールバックを実装しているため、私には弱い、または所有されていないユーザーのみを使用できます。 –

+0

弱い問題はありません。あなたがデータを読み込もうとしているのは問題です。あなたは 'viewDidLoad'でデータをロードして、標準のプロセスにView Controllerをインスタンス化させるだけです。 – Paulw11

答えて

0

weakはオプションとして宣言されていますが、到達できない場合は変数にnilを指定できます。したがって、viewcontrollerがロードされるまでは正常になりません。

viewDidLoadは、viewcontrollerのライフサイクルにある関数の実行に依存するべきではありません。

+0

viewControllerは、そのviewDidload関数でデバッグ出力を見ることができるので、ロードします。残念ながら私はこのコードに固執しています。操作を親コントローラに移して、何とかviewControllerに注入して依存させるのは賢明ではないでしょうか? –

+0

私は素晴らしい動きになると思います! – abdullahselek

関連する問題