2011-10-18 48 views
23

我使用下面的代碼呈現模式駁回模式後不叫:的iOS 5:-viewWillAppear在iPad上

AddName *add = [[AddName alloc] initWithNibName:@"AddName" bundle:nil] 
add.modalPresentationStyle = UIModalPresentationFormSheet; 

[self presentModalView:add animated:YES]; 

和我的工作後,我使用下面的代碼就回去我的主要觀點。

[self dismissModalViewControllerAnimated:YES]; 

因此默認使用-viewWillAppear

我的問題是,

這是工作的罰款與的iOS4.3

但它不能與iOS5

我該怎麼辦?或者是否有任何錯誤iOS5

+0

問題是-viewWillAppear沒有被調用?或者是模式窗口沒有被呈現? – gaige

+0

@gaige:YES --viewWillAppear不叫 – Devang

+0

@Devang:刪除'add.modalPresentationStyle = UIModalPresentationFormSheet;'它會調用viewWillAppear方法。請檢查一下。 –

回答

11

-viewWillAppear只能保證在-viewWillDisappear也被調用的地方調用。對於iPad上的大多數模式窗口,情況並非如此,因爲它們不會遮擋整個頁面。

問題的解決方案取決於您需要的-viewWillAppear,但通常情況下,您可能需要直接從關閉模式視圖控制器的同一位置撥打電話。

對此的一種常見機制,尤其是在可能在其他地方使用相同模態視圖的情況下,應爲模態視圖控制器提供一個委託,在視圖即將消失時調用該委託。這將使您有機會從模式窗口獲取響應,甚至只需在委託視圖中強制重新載入數據。

希望這會有所幫助。

+6

而不是在iOS5中的委託,你可以嘗試[[self presentingViewController] viewWillAppear:YES]; – NJones

+0

@NJones雖然你可以調用viewWillAppear:我會建議它,因爲它有其他副作用(因爲文檔說明你必須調用super)。 – gaige

+0

我假定你的意思是你不會建議它? – NJones

9

iOS 5確實將其呼叫改爲viewWillAppearviewWillDisappear。例如,UIScrollViewviewWillDisappear中的子視圖(View Controller's views作爲精確子視圖)將在您將另一個視圖控制器推入堆棧時被調用。但是,當視圖控制器彈出時,viewWillAppear不會被調用。這些方法在UIScrollView子視圖中從未在iOS 4中調用過。

這對我來說很奇怪。再加上無論發生什麼事情,如果你可以依靠它在iOS 4中發生的事實,在iOS 5中它不應該有不同的工作。大多數情況下,我不知道每個人調用哪個特定實例,我通常會嘗試錯誤,因爲我在區域編碼中。如果它按我喜歡的方式工作,我繼續前進。然後,iOS 5進入並將一個破壞球扔進一切。

我也遇到過,當UINavigationController's視圖是一個子視圖,並且ViewController推導航控制器堆棧上,viewWillAppear不會被調用在iOS 4的,但它被調用在IOS 5進入數字。

+0

誰投票,請嘗試這個項目與iOS 4和iOS 5模擬器,並告訴我你在兩個模擬器中獲得斷點...這是在FirstViewController.m中的NSLog語句。 https://docs.google.com/open?id=0B5DJHlwe-2MTYjY0ZDMyMzgtY2Q3Zi00NzRlLWEyYmQtMGY0YjgzMDNjZDdk – Vinnie

2

我有同樣的問題。 我發現viewWillAppear在解散模態後沒有被調用,但是viewDidAppear是。所以試試viewDidAppear

+1

在模態視圖中,我添加了'presentationViewController.viewDidAppear(true)',然後它工作,但在那裏添加了updateUI()(private func)調用。 –

+0

它不起作用。而且它似乎從未行得通 –