2011-03-24 36 views
9

我已將我的iPhone應用代碼中的問題追蹤到viewDidAppear方法,但並非總是發射。當您啓動應用程序時,事件會按預期啓動。但是,如果我使用能夠多任務處理並重新打開的手機關閉應用程序,我的viewDidAppear事件不再觸發。viewDidAndar在應用進入前景後再次不再發射

我的意見從Nibs加載,我使用viewDidUnload清理(釋放和零所有網點)。我的意見嵌套在側面和標籤欄,然後導航控制器。我看起來像事件沒有正確連接時,筆尖重新加載。任何想法,我在做什麼錯/缺少以及如何解決這個問題?

在此先感謝。

UPDATE我不是說應用程序第一次進入前臺時事件並未被解僱。我的意思是這個事件再也不會發生。即使在選項卡之間切換或移動導航視圖時也是如此。

實施例:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    NSLog(@"viewDidAppear called"); 
} 

此代碼被放置在兩個視圖中,每個不同的選項卡。每次我在標籤之間切換「viewDidAppear called」被寫入日誌。當我關閉並重新打開應用程序並在選項卡之間切換時,不再發生這種情況。其他按鈕事件正常啓動。

+0

是否還有其他NSLogs出現?我的意思是,這並不是所有NSLogs都沒有做任何事情的問題,一旦你開始後續和恢復? – occulus 2011-03-24 11:02:14

+0

你在UIViewControllers方面做了什麼異常或複雜的UI設置?例如,您是否在嵌套Apple推薦不嵌套的東西? – occulus 2011-03-24 11:05:44

回答

7

找到它。

儘管對編程並不陌生,但我對iPhone開發並不陌生。在研究這個問題時,我發現不建議手動調用viewWillAppearviewWillDisappear方法。

viewWillDisappear方法辭職任何鍵盤如果顯示,當我的應用程序進入它加載啓動畫面準備當應用程序重新進入前臺的背景(有一些邏輯,我需要做的工作出用戶是什麼顯示在重新啓動應用程序,我可以在啓動畫面下執行此操作)。

由於viewWillDisappear不叫當應用程序進入後臺,以確保沒有鍵盤出現在我的啓動畫面我打電話的applicationDidEnterBackground方法viewWillDisapper。我想這也會取消註冊我的活動。

通過將viewWillAppear添加到我的applicationDidEnterForeground方法中,我的事件再次開始觸發。經驗教訓,我會重構這個,所以我不會手動調用這些事件。

感謝您的幫助。

+1

很高興您對它進行了排序。你應該接受你自己的答案 - 這是允許的,你應該,如果你找到自己的問題的答案。 – occulus 2011-03-25 15:32:28

+1

我強烈建議這個線程的解決方案做這樣的特技:http://stackoverflow.com/questions/15864364/viewdidappear-is-not-called-when-opening-app-from-background – Wirsing 2013-12-07 01:12:06

10

順便說一句,該viewDidUnload方法實在太差了名爲順便說一句 - 這不是一個「反」到viewDidLoad,如果是由於被卸載不處於可見光內存不足的情況,該控制器的看法這只是叫時間。

(原件,沒有那麼答非所問:)

請參閱我的回答這個類似的問題:

Why does viewWillAppear not get called when an app comes back from the background?

基本上,後您的UIViewController的觀點加入到viewDidAppear被調用應用程序的UIWindow圖層。背景,然後恢復應用程序不會改變你的觀點,所以viewDidAppear不會被調用 - 這是正確的行爲,而不是一個錯誤。查看UIViewController的API文檔。

+0

:)它永遠不會再被調用。即使我在標籤之間切換,推送和彈出視圖。一旦我將應用程序最小化並重新打開,此事件再也不會被解僱。 – Magpie 2011-03-24 10:12:16

+1

確保你的所有viewController在viewDidAppear方法中調用了[super viewDidAppear],否則這個消息可能會丟失。 – 2011-03-24 10:38:45