2015-04-07 38 views
1

我的視圖層次是這樣的:標籤控制器中的視圖控制器如何知道它何時被解開?

Splash view -> "show" segue-> Tab Bar Controller (with 3 tabs) 

就是這樣。非常簡單的應用。

在最後一個選項卡上,我有一個註銷按鈕。推送時,此註銷按鈕將執行返回到飛濺視圖的展開segue。 (我猜這破壞了選項卡控制器及其所有3個視圖...但請讓我知道如果我錯了)。

所以我的問題是:

如何將我的其他2個選項卡知道什麼時候回捲賽格瑞正在由最後一個標籤叫什麼?我需要在用戶再次看到啓動頁面之前刪除觀察者等。

+0

@Rob是「addObserverForName」,最後有一個閉包被認爲是基於塊的觀察者? – TIMEX

回答

1

每個控制器的dealloc方法裏面完成,這是剛剛放鬆正常人一樣,讓正常的釋放過程中去除觀察員你的最簡單方法。但要做到這一點,您必須確保您沒有強大的參考週期。

讓我們假設您有一位觀察者在內存壓力下清空緩存。如果你想刪除的觀察者當對象被釋放,你會使用unowned self參考:

let cache = NSCache() 
var observer: NSObjectProtocol! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    observer = NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationDidReceiveMemoryWarningNotification, object: nil, queue: nil) { [unowned self] notification in 
     self.cache.removeAllObjects() 
    } 
} 

然後,你可以安全地刪除觀察員deinit無懼很強的參考週期:

deinit { 
    NSNotificationCenter.defaultCenter().removeObserver(observer) 
} 

您沒有分享您正在觀察的內容,但它說明了這個想法:通過在提供給addObserverForName的閉包中使用[unowned self]來打破強參考週期。有關weakunowned引用self的更多信息,請參閱Resolving Strong Reference Cycles for ClosuresSwift編程語言。

+0

我可以在任何地方將[無主自我]放在封閉處嗎?只是爲了安全起見? – TIMEX

+0

沒有時候你想要'[weak self]'(如果在閉包運行之前有可能將對象解除分配)。一個常見的例子就是在視圖控制器發佈後,您可能會合理預期的網絡請求。有時你需要強有力的參考(即既不是「無主」也不是「弱」)。你真的應該考慮對特定情況有意義的對象所有權結構。 – Rob

1

在選項卡欄控制器中,在prepareForSegue:期間,識別正在執行的繼續是否爲退風繼續(您需要爲退出繼續指定一個標識符)。

在確定了segue是unwind segue之後,可以通知控制器在選項卡欄控制器中,他們現在應該刪除觀察者和所有需要的進程。

替代:你可以做它的標籤欄控制器

+0

我的選項卡欄控制器沒有自己的swift文件(儘管其中的3個控制器有自己的swift文件)。它是否應該有自己的swift文件來檢查prepareForSegue? – TIMEX

+0

是的。或者,您可以在dealloc期間執行此操作。當選項卡欄控制器從視圖層次結構中彈出時,其視圖控制器將被解除分配 –

+0

爲什麼說「dealloc」被標記爲不可用?我也嘗試過deinit {},但是當我從其中一個選項卡中解開時,它不會被調用。 – TIMEX

相關問題