10

此問題之前已被詢問過,但我能找到的回答來自2009年,並不適合我的問題。讓我重申這個問題。在iOS4中彈出視圖控制器時會收到通知

我有一個UINavigationController,它會產生並推動很多不同的UIViewController到它的堆棧上。其中一項交易涉及一些核心數據操作,當某個特定VC獲得從堆棧中彈出時需要保存。不要關注核心數據部分,而是關於彈出窗口。

我該如何掛鉤UIViewController將從堆棧中彈出?

  • 我希望有某種委託方法,但找不到它。 UINavigationControllerDelegate協議非常稀疏。
  • 然後我開始使用viewWillDisappear的思維,但一個是如果另一種觀點則被推到堆棧也叫,所以它並沒有提供恰當的時機。
  • This answered question, from 2009,選擇查看我們'彈出'的視圖控制器的viewWillAppear,但由於該調用沒有引用需要執行檢查的VC,因此這是不令人滿意的,並且會引入一個反生產的依賴程度(VC被多個NC使用)。
  • Another answered question, also from 2009,選擇子類UINavigationController並重寫popViewControllerAnimated:方法。或者使用VC的dealloc。我的直覺告訴我,不可能走的路。
  • 終於有one last recent question from march 2011,但沒有人關心它回答。

這給我留下了我目前不滿意的狀態。有沒有人有更好的解決方案來找到你的UIViewController從UINavigationController的棧中彈出的那一刻?

乾杯,
EP。

+0

我面臨同樣的問題。但是,我可以根據http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/DeprecationAppendix/AppendixAprerecatedAPI.html添加一些信息,viewDidUnload&viewWillUnload在iOS6下已棄用 –

回答

9

viewWillDisappear是合適的代表。您需要在此方法中添加邏輯,如果你想確定當前觀點是彈出觀點是。這是在這裏得到解答 - viewWillDisappear: Determine whether view controller is being popped or is showing a sub-view controller

+0

Spot on,wrapped它在一個類別和作品像一個魅力。謝謝@Jason! – epologee

+9

我只是看看你的答案。它看起來不錯,但對於真正需要的有點太複雜。我建議這可能更清潔: 'if(![self.navigationController.viewControllers containsObject:self]){ // POPPED! }' –

+0

好的。無論如何,在導航控制器的堆棧中使用相同的VC會很奇怪。乾杯! – epologee

0

我相信我會在這個方向去另一個方向,並嘗試捕獲從單個viewControllers而不是navigationController輪詢。對於一個單獨的viewController來說,獲取彈出窗口看起來像被釋放,這是完全可以連接的。

子類UIViewController,在其-dealloc中實現您的通知。一定要致電[super dealloc]

然後讓您將每個視圖添加到您的導航控制器子類中您的新自定義視圖控制器子類。他們可以在自己的viewDidUnload中執行任何操作,然後調用[super dealloc](在這種情況下,super是您的UIViewController子類)來觸發通知。

+0

這不行。如果您從導航控制器堆棧中彈出一個VC,它將不會通過-viewDidUnload –

+0

@Pier - 您確定?我已經做了這樣的事情,但已經有一段時間了......我可能會抓住'dealloc'嗎? –

+0

是-dealloc被調用。 viewDidUnload僅在VC收到內存警告並且不是頂部視圖控制器時調用。 –

相關問題