2017-03-09 56 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他認爲控制器直接從UITabController加載。我如何獲得getActiveSubscriptionCompletionBlock在關閉中維護self

+0

你沒有顯示你的代碼的完整上下文,但我認爲'let sponsorViewController ...'是在某個函數內。只要該函數退出,'let'變量超出範圍。由於閉包使用'弱自我',這不足以保持視圖控制器,所以它被釋放。由您的選項卡控制器加載的視圖控制器的實例是一個不同的實例。 – Paulw11

+0

不幸的是,關閉只允許我使用弱或無主,因爲它實現了ServerOperation的回調callbackQueue.addOperationWithBlock –

+0

弱是不是問題。噢,你正試圖加載數據是問題。您應該將數據加載到'viewDidLoad'中,並讓標準進程負責爲您實例化視圖控制器。 – Paulw11

回答

0

weak被聲明爲可選,如果不可達,變量可以爲零。因此,直到viewcontroller加載它是正常的。

對我來說,viewDidLoad不應該依賴它在viewcontroller的生命週期中執行的函數。

+0

viewController會加載,因爲我可以在該viewDidload函數中看到調試輸出。我同意,不幸的是我堅持使用這段代碼。將操作移動到父控制器然後以某種方式將注入和依賴注入到viewController中會不太明智嗎? –

+0

我覺得我會是一個偉大的舉動! – abdullahselek