2013-01-23 40 views

回答

11

我使用的簡單規則是這樣的。 viewDidLoad是視圖的資源加載時。該視圖尚未在屏幕上繪製。因此,不應將處理視圖的幾何和視覺的計算和代碼放在這裏。他們應該在viewWillAppearviewDidAppear方法中。

此外viewWillAppear中可以多次調用

  1. 當顯示酥料餅/模態的視圖,並刪除
  2. 當顯示警報視圖/ actionsheet/uiactivityController的視圖併除去。

由於這些原因,viewWillAppear不應包含需要更長時間才能完成的代碼。 (至少是在主線程上運行的代碼)。每個視圖顯示只需要運行一次代碼。

我確信還有更多,但這些都很簡單,我希望它有幫助。

4

viewDidLoad中:你警報視圖已完成加載

viewWillAppear中:運行得認爲負載

viewDidLoad之前的事情你必須做一次。每次出現視圖時都會調用viewWillAppear。你應該做的事情,你只需要做一次在viewDidLoad - 就像設置你的UILabel文本。但是,您可能需要在用戶每次查看該視圖時修改視圖的特定部分,例如每次進入「正在播放」視圖時,iPod應用程序都會將歌詞滾動回頂部。

但是,當您從服務器加載內容時,還必須考慮延遲。如果你將所有的網絡通信打包到viewDidLoad或viewWillAppear中,它們將在用戶看到視圖之前執行 - 可能導致應用程序短暫凍結。首先向用戶顯示帶有某種活動指示符的未填充視圖可能是個好主意。當您完成網絡連接時,可能需要一兩秒鐘(甚至可能會失敗 - 誰知道?),您可以使用數據填充視圖。各種嘰嘰喳喳客戶都可以看到關於如何做到的好例子。例如,當您在Twitterrific中查看作者詳細信息頁面時,該視圖只會在網絡查詢完成之前顯示「正在加載...」。

+0

很好的解釋,只是我讀過它之前在這裏:http://stackoverflow.com/questions/1579550/uiviewcontroller-viewdidload-vs-viewwillappear-what-is-the-proper-division-of –