3 回答

TA貢獻1828條經驗 獲得超3個贊
總的來說,這就是我要做的:
1)ViewDidLoad-每當我向應該與該視圖一起顯示的視圖添加控件時,我都會立即將其放在ViewDidLoad方法中?;旧希灰獙⒁晥D加載到內存中,就會調用此方法。因此,例如,如果我的視圖是帶有3個標簽的表單,則可以在此處添加標簽;例如,沒有這些形式,視圖將永遠不存在。
2)ViewWillAppear:我通常使用ViewWillAppear只是為了更新表單上的數據。因此,對于上面的示例,我將使用它來將域中的數據實際加載到表單中。創建UIView相當昂貴,您應該避免在ViewWillAppear方法上執行盡可能多的操作,因為調用該方法時,它意味著iPhone已經準備好向用戶顯示UIView,而您在此處所做的任何繁重的工作將以非常明顯的方式影響性能(例如動畫被延遲等)。
3)ViewDidAppear:最后,我使用ViewDidAppear為需要很長時間才能執行的事情啟動新線程,例如進行webservice調用以獲取上述表單的額外數據,這是因為視圖已經存在并正在顯示給用戶,則可以在獲取數據時向用戶顯示一個不錯的“等待”消息。

TA貢獻1796條經驗 獲得超4個贊
viewDidLoad === >>>將您的初始化代碼放在這里。不要放置在視圖生命周期中可能發生變化的動態數據。因此,如果您要從核心數據中提取數據,則在此視圖的生命周期內這種情況可能會發生變化時,您不想在此處進行操作。例如:說您有一個標簽控制器。您從tab1切換到tab2,并在tab2中的模型上進行了更改。如果返回tab1并且您的模型代碼在viewDidLoad中完成,則不會更新(假設您未使用KVO或NSFetchedResultsController等)。
viewWillAppear === >>>每當視圖即將出現時,無論視圖是否已經在內存中,都會調用此方法。將動態代碼放在這里,例如模型邏輯。
viewDidAppear === >>>僅在確定視圖在屏幕上(例如網絡調用)時,才需要執行昂貴的操作。
注意:如果您的應用程序是后臺運行并返回到前臺,則需要使用NSNotificationCenter進行處理。我在下面的注釋中為此編寫了代碼。您可能認為viewWillAppear / viewDidAppear將觸發。在此處放置一個斷點并對其進行測試。它不會開火。因此,如果您的應用在后臺運行時發生了變化,則需要使用通知進行更新。

TA貢獻1829條經驗 獲得超4個贊
一些觀察:
viewDidLoad
首次實例化視圖時調用該方法。IBOutlet
引用是在調用它的時間(而不是在此之前)連接的。但是frame
,視圖的調用可能尚未建立。這是添加/配置子視圖及其關聯約束的好地方。但是,如果您要frame
根據主視圖的尺寸進行任何手動的值配置,則應將這些框架的配置推遲到viewWillAppear
或viewDidLayoutSubviews
。viewWillAppear
當視圖層次結構中的視圖表示即將開始時,將調用該方法。值得注意的是,這是在視圖呈現的動畫(如果有)的開始處調用的。viewWillDisappear
當離開此視圖的過渡開始時,顯然會調用其伴侶。viewDidAppear
當完成視圖的呈現時,尤其是在完成所有關聯的動畫之后,將調用此方法。viewDidDisappear
當完成離開此視圖的轉換時,顯然會調用它的同伴。
兩個重要警告:
viewDidLoad
首次實例化視圖時,僅調用一次,并且僅調用一次。另一方面,不僅會在首次顯示視圖時調用,viewWillAppear
而且viewDidAppear
還會在以后的每一次重新顯示所討論的相同視圖時調用。例如,當您首次顯示視圖時,將同時調用這三種方法。如果有問題的觀點隨后呈現隨后被解雇時,另一種觀點認為viewWillAppear
,并viewDidAppear
在有問題的視圖添加和動畫回視圖層次一般會被再次調用,但viewDidLoad
不會。viewDidLoad
僅在首次創建此特定實例時調用。因此,如果您希望每次重新顯示視圖時都執行某項操作(例如,關閉或彈出視圖),請在
viewWillAppear
或中進行操作viewDidAppear
。如果希望僅在首次實例化視圖時才發生,請在中進行viewDidLoad
。的調用
viewWillAppear
并不保證將完全完成向該視圖的轉換。值得注意的是,如果您使用的是由實時用戶輸入驅動的交互式轉換,但是可以取消該交互式轉換。即,僅因為viewWillAppear
被調用,并不意味著viewDidAppear
將被調用。通常是這樣,但是如果取消了交互式筆勢,則不會(因為過渡從未完成)。在WWDC 2013上,在交互式過渡的上下文中,演示者開玩笑說應將其重命名
viewWillAppear
為“viewMightAppear
,或viewWillProbablyAppear
或iReallyWishThisViewWouldAppear
”。內置交互手勢的一個示例是當使用a時
UINavigationController
,您“從左邊緣滑動”以啟動視圖彈出。該viewWillAppear
會呼吁給你如雨后春筍般冒出的觀點,但如果取消,“從左側邊緣滑動”要返回從中啟動此彈出的姿態來看,在彈出被取消,viewDidAppear
該視圖你開始彈出回到永遠不會被調用。這樣做的最終結果是,您應注意不要編寫假定每個
viewWillAppear
最終都會調用的代碼viewDidAppear
。如果取消過渡,則情況并非如此。
- 3 回答
- 0 關注
- 1603 瀏覽
添加回答
舉報