天天看點

iOS視圖生命周期

 視圖是應用的一個重要組成部分,功能的實作與其息息相關,而視圖控制器控制着視圖,其重要性在整個應用中不言而喻。

1.視圖生命周期與視圖控制器關系

  以視圖的4 種狀态為基礎,我們來系統了解一下視圖控制器的生命周期。在視圖不同的生命周期中,視圖控制器會回調不同的方法,具體如圖1 所示。

iOS視圖生命周期

                                                                   圖1 視圖控制器的一些主要方法

  在視圖控制器已被執行個體化,視圖被加載到記憶體中時調用viewdidload方法,這個時候視圖并未出現。在該方法中,通常進行的是對所控制的視圖進行初始化處理。

視圖可見前後會調用viewwillappear:方法和viewdidappear: 方法;視圖不可見前後會調用viewwilldisappear: 方法和viewdiddisappear:方法。4個方法調用父類相應的方法以實作其功能,編碼時該方法的位置可根據實際情況做以調整,參見如下代碼:

  viewdidload 方法在應用運作的時候隻調用一次,而這上述4 個方法可以被反複調用多次,它們的使用很廣泛但同時也具有很強的技巧性。例如,有的應用會使用重力加速計,重力加速計會不斷輪詢裝置以實時獲得裝置在z 軸、x 軸和y軸方向的重力加速度。不斷的輪詢必然會耗費大量電能進而影響電池使用壽命,我們通過利用這4個方法适時地打開或者關閉重力加速計來達到節約電能的目的。怎麼使用這4 個方法才能做到“适時”是一個值得思考的問題。 

  在低記憶體情況下,ios 會調用didreceivememorywarning: 和viewdidunload:方法。在ios 6 之後,就不再使用viewdidunload:,而僅支援didreceivememorywarning:。didreceivememorywarning: 方法的主要職能是釋放記憶體,包括視圖控制器中的一些成員變量和視圖的釋放。現舉例如下:

 除了上述5 個方法視圖控制器外,還有很多其他方法。

2.ios  ui 狀态保持和恢複

  ios 設計規範中要求,當應用退出的時候(包括被終止運作的時候),需要保持界面中ui元素的狀态,當再次進來的時候看到的狀态與退出時是一樣的。在ios 之後,蘋果提供以下api使得ui狀态保持和恢複變得很容易。

在ios 中,我們可以在以下3種地方實作狀态保持和恢複:

   應用程式委托對象

 視圖控制器

 自定義視圖

  恢複辨別是ios  為了實作ui狀态保持和恢複添加的設定項目。我們還需要在應用程式委托對象appdelegate代碼部分做一些修改,添加的代碼如下:

其中application:shouldsaveapplicationstate:方法在應用退出時調用,負責控制是否允許儲存狀态,傳回yes 情況是可以儲存,no是不儲存。

application:shouldrestoreapplicationstate:方法在應用啟動時調用,負責控制是否恢複上次退出時的狀态,傳回yes 表示可以恢複,傳回no表示不可以恢複。

application:willencoderestorablestatewithcoder:方法在儲存時調用,在這個方法中實作ui狀态或資料的儲存,其中[coder encodefloat:2.0 forkey:@"version"] 語句是儲存簡單資料。

application:diddecoderestorablestatewithcoder:方法在恢複時調用,在這個方法中實作ui狀态或資料的恢複,其中[coder decodefloatforkey:@"version"] 語句用于恢複上次儲存的資料。

想要實作具體界面中控件的保持和恢複,還需要在它的視圖控制器中添加一些代碼。我們在viewcontroller.m中添加的代碼如下:

在ios 6之後,視圖控制器都添加了兩個方法——encoderestorablestatewithcoder: 和decoderestorablestatewithcoder: ,用來實作該控制器中的控件或資料的儲存和恢複。其中encoderestorablestatewithcoder:方法在儲存時候調用,[coder encodeobject:self. txtfield.textforkey:ksavekey]語句是按照指定的鍵儲存文本框的内容,decoderestorablestatewithcoder:方法在恢複時調用,[coder decodeobjectforkey:ksavekey]在恢複文本框内容時調用,儲存和恢複事實上就是向一個歸檔檔案中編碼和解碼的過程。

繼續閱讀