iOS视图生命周期
視圖是應(yīng)用的一個重要組成部分,功能的實現(xiàn)與其息息相關(guān),而視圖控制器控制著視圖,其重要性在整個應(yīng)用中不言而喻。
1.視圖生命周期與視圖控制器關(guān)系
以視圖的4 種狀態(tài)為基礎(chǔ),我們來系統(tǒng)了解一下視圖控制器的生命周期。在視圖不同的生命周期中,視圖控制器會回調(diào)不同的方法,具體如圖1 所示。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??圖1?視圖控制器的一些主要方法
在視圖控制器已被實例化,視圖被加載到內(nèi)存中時調(diào)用viewDidLoad方法,這個時候視圖并未出現(xiàn)。在該方法中,通常進行的是對所控制的視圖進行初始化處理。
視圖可見前后會調(diào)用viewWillAppear:方法和viewDidAppear: 方法;視圖不可見前后會調(diào)用viewWillDisappear: 方法和viewDidDisappear:方法。4個方法調(diào)用父類相應(yīng)的方法以實現(xiàn)其功能,編碼時該方法的位置可根據(jù)實際情況做以調(diào)整,參見如下代碼:
viewDidLoad 方法在應(yīng)用運行的時候只調(diào)用一次,而這上述4 個方法可以被反復(fù)調(diào)用多次,它們的使用很廣泛但同時也具有很強的技巧性。例如,有的應(yīng)用會使用重力加速計,重力加速計會不斷輪詢設(shè)備以實時獲得設(shè)備在z 軸、x 軸和y軸方向的重力加速度。不斷的輪詢必然會耗費大量電能進而影響電池使用壽命,我們通過利用這4個方法適時地打開或者關(guān)閉重力加速計來達到節(jié)約電能的目的。怎么使用這4 個方法才能做到“適時”是一個值得思考的問題。?
在低內(nèi)存情況下,iOS 會調(diào)用didReceiveMemoryWarning: 和viewDidUnload:方法。在iOS 6 之后,就不再使用viewDidUnload:,而僅支持didReceiveMemoryWarning:。didReceiveMemoryWarning: 方法的主要職能是釋放內(nèi)存,包括視圖控制器中的一些成員變量和視圖的釋放。現(xiàn)舉例如下:
- (void)didReceiveMemoryWarning { self.button = nil; self.myStringD = nil; [myStringC release]; //ARC內(nèi)存管理情況下不用 [super didReceiveMemoryWarning]; }除了上述5 個方法視圖控制器外,還有很多其他方法。
2.iOS ?UI 狀態(tài)保持和恢復(fù)
iOS 設(shè)計規(guī)范中要求,當應(yīng)用退出的時候(包括被終止運行的時候),需要保持界面中UI元素的狀態(tài),當再次進來的時候看到的狀態(tài)與退出時是一樣的。在iOS 之后,蘋果提供以下API使得UI狀態(tài)保持和恢復(fù)變得很容易。
在iOS 中,我們可以在以下3種地方實現(xiàn)狀態(tài)保持和恢復(fù):
? 應(yīng)用程序委托對象
? 視圖控制器
? 自定義視圖
恢復(fù)標識是iOS ?為了實現(xiàn)UI狀態(tài)保持和恢復(fù)添加的設(shè)置項目。我們還需要在應(yīng)用程序委托對象AppDelegate代碼部分做一些修改,添加的代碼如下:
-(BOOL) application:(UIApplication *)application shouldSaveApplicationState: (NSCoder *)coder { return YES; } -(BOOL) application:(UIApplication *)application shouldRestoreApplicationState: (NSCoder *)coder { return YES; } - (void)application:(UIApplication *)application willEncodeRestorableStateWithCoder: (NSCoder *)coder { [coder encodeFloat:2.0 forKey:@"Version"]; } - (void)application:(UIApplication *)application didDecodeRestorableStateWithCoder: (NSCoder *)coder { float lastVer = [coder decodeFloatForKey:@"Version"]; NSLog(@"lastVer = %f",lastVer); }
其中application:shouldSaveApplicationState:方法在應(yīng)用退出時調(diào)用,負責(zé)控制是否允許保存狀態(tài),返回YES 情況是可以保存,NO是不保存。
application:shouldRestoreApplicationState:方法在應(yīng)用啟動時調(diào)用,負責(zé)控制是否恢復(fù)上次退出時的狀態(tài),返回YES 表示可以恢復(fù),返回NO表示不可以恢復(fù)。
application:willEncodeRestorableStateWithCoder:方法在保存時調(diào)用,在這個方法中實現(xiàn)UI狀態(tài)或數(shù)據(jù)的保存,其中[coder encodeFloat:2.0 forKey:@"Version"] 語句是保存簡單數(shù)據(jù)。
application:didDecodeRestorableStateWithCoder:方法在恢復(fù)時調(diào)用,在這個方法中實現(xiàn)UI狀態(tài)或數(shù)據(jù)的恢復(fù),其中[coder decodeFloatForKey:@"Version"] 語句用于恢復(fù)上次保存的數(shù)據(jù)。
想要實現(xiàn)具體界面中控件的保持和恢復(fù),還需要在它的視圖控制器中添加一些代碼。我們在ViewController.m中添加的代碼如下:
在iOS 6之后,視圖控制器都添加了兩個方法——encodeRestorableStateWithCoder: 和decodeRestorableStateWithCoder: ,用來實現(xiàn)該控制器中的控件或數(shù)據(jù)的保存和恢復(fù)。其中encodeRestorableStateWithCoder:方法在保存時候調(diào)用,[coder encodeObject:self. txtField.textforKey:kSaveKey]語句是按照指定的鍵保存文本框的內(nèi)容,decodeRestorableStateWithCoder:方法在恢復(fù)時調(diào)用,[coder decodeObjectForKey:kSaveKey]在恢復(fù)文本框內(nèi)容時調(diào)用,保存和恢復(fù)事實上就是向一個歸檔文件中編碼和解碼的過程。
?
轉(zhuǎn)載于:https://www.cnblogs.com/chars/p/4993040.html
總結(jié)
- 上一篇: 禁毒大队需要禁毒支队解决的问题有哪些?
- 下一篇: 自主择业军官有优待证吗现在?