讓viewDidLoad和viewWillAppear各司其責

來源:互聯網
上載者:User

註:本文由破船譯自:thejoeconwayblog

你是否有過這樣的感覺:有時某些代碼是放到viewDidLoad還是viewWillAppear:中,這很容易讓人混淆。在Stack
Overflow上經常會遇到這樣的問題:viewDidLoad和viewWillAppear到底哪個方法先被調用?實際上,理解這些方法的去向,以及為什麼會這樣並不重要,重要的是需要知道這些方法的作用,以及它們是如何與程式協調分工的。

我們知道,一般iOS應用程式都是由多個view controller構成的,每個view controller代表一個螢幕的資訊。而當程式與使用者互動時,根據程式中不同的狀態,顯示不同的view controller。例如,如果使用者需要註冊一個帳號時,螢幕上應該顯示出允許使用者輸入個人資訊的介面,當使用者完成註冊之後,應該能夠看到相應的首頁面。

viewWillAppear:方法的作用是與螢幕中改變的內容進行互動。告訴view
controller將對應的介面內容顯示到螢幕最前端:確保view controller中所有的文本控制項顯示出最新的資訊、必要的資料是可訪問的、並對適當的通知(notification)進行觀察等。當viewWillAppear:被觸發時,說明對應的view controller變為”active”狀態。

那麼viewDidLoad方法存在的理由又是什麼呢?唯一的原因——有時無法或者不能有效在XIB檔案中對使用者介面進行100%的配置。例如,有時希望給view設定一個特殊的屬性(該屬性在XIB中不可用)、有時在給一個button設定背景圖片之前,希望能先對該圖片進行修改、再比如,在使用auto
layout時,有時你可能會意識到在XIB中進行相關操作還不如用代碼來寫auto layout相關的代碼。

我們不能根據viewDidLoad方法的調用情況,來推斷出應用程式的狀態相關資訊。viewDidLoad方法實際上就是簡單的一個檔案載入後處理機制。換句話說,作為開發人員,應該把viewDidLoad方法當做XIB檔案的一個有效擴充,而不要理解為應用程式運轉流程中的一部分。

這到底是什麼意思呢?——我們應該在viewWillAppear:方法中對view中顯示的內容進行變更,而不是在viewDidLoad中。view中的內容是程式實際運行時由controller傳遞給view來顯示的資料(模型對象)。

下面我們來看一個樣本:一個銀行應用程式,可以顯示使用者當前的餘額。當使用者點擊一個按鈕時,可以在一個modal view controller中顯示一個列表:該列表列出了使用者附近的ATM機。在此,為了獲得附近的ATM機列表資訊,程式必須使用core location已經web service請求。在上面這種情況下,如果程式員把從伺服器請求使用者附近ATM列表的操作放到viewDidLoad中。此時,由於view controller只顯示一次(viewDidLoad和viewWillAppear都只會被調用一次),所以,從伺服器請求使用者附近ATM列表的操作,放到viewDidLoad與viewWillAppear中,對程式的效果都是一樣的。

但是這樣做法是不好的。想一下,如果把這個ATM view controller移到tab bar controller中,會是什麼情況。現在,ATM view controller——在viewDidLoad中擷取ATM資訊的代碼只會擷取一次。所以,如果你周二在亞特蘭大開啟該程式尋找ATM,然後查詢一下餘額。接著周三你去了紐約,再次開啟該程式時,只能看到亞特蘭大的ATM資訊——view已經載入過了,所以不會再調用viewDidLoad方法。
注意:在這裡應該有這樣的前提條件:程式沒有退出。

實際上,在這種情況下,寫代碼時犯下了一個最大的錯誤:the
easiest way is the easiest way。應用程式是會發生變化的,而使用者介面也會發生改變。剛開始使用簡單的方法,可能會在以後引發各種問題。

本文由 破船翻譯●轉載請註明出處●2013-07-02

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.