天天看點

IOS 講解 UIViewController對象(九)

作者:Nirvana柯本
IOS 講解 UIViewController對象(九)

大哥鎮樓,期待9彈!

73.

- (void)setOverrideTraitCollection:(nullable UITraitCollection *)collection forChildViewController:(UIViewController *)childViewController

方法類型:動态

參數:1.collection參數為目前視圖控制器的子視圖控制器要使用的新的UITraitCollection對象執行個體。2.childViewController參數為要改變的子視圖控制器執行個體(已認證addChildViewController方法添加的)。

傳回值:無。

功能:作用為将新的UITraitCollection(應用程式的界面樣式,顯示比例和使用者界面習慣用法等特性。)對象執行個體應用在目前視圖控制器的子視圖控制器上。一般來說,目前視圖控制器的特性會自動的傳遞給子視圖控制器,但如果子視圖控制器要變現出不同的特性的時候,可以使用這個方法強制的進行調整。

74.

- (nullable UITraitCollection *)overrideTraitCollectionForChildViewController:(UIViewController *)childViewController

方法類型:動态

參數:1.childViewController參數為要傳回UITraitCollection對象執行個體的子視圖控制器執行個體(已認證addChildViewController方法添加的)。

傳回值:childViewController參數指向的視圖控制器使用的UITraitCollection對象執行個體。

功能:作用為使用此方法搜尋并傳回子視圖控制器的UITraitCollection對象執行個體。然後可以修改指定的子視圖控制器的UITraitCollection對象,并使用setOverrideTraitCollection方法對其進行設定。

75.

BOOL shouldAutomaticallyForwardAppearanceMethods

隻讀,作用是目前的視圖控制器(UINavigationController這種容器類型或存在通過addChildViewController方法添加的子視圖控制器)在系統自動調用viewWillAppear,viewDidAppear, viewWillDisappear,viewDidDisappear這些方法時,是否也調用子視圖控制器的這些回調方法。預設為YES,需要轉發。通過重寫該方法,傳回NO時,系統将不再調用子視圖控制器以上的方法,但可以通過beginAppearanceTransition和endAppearanceTransition來進行調用。傳回YES時系統将自動調用以上的方法,預設該值為YES。

76.

- (void)willMoveToParentViewController:(nullable UIViewController *)parent

方法類型:動态

參數:1.parent參數為目前視圖控制器的父視圖控制器執行個體,如果沒有則為nil(被移除時)。

傳回值:無。

功能:作用為目前視圖控制器将要被添加到一個視圖控制器中或将要從一個視圖控制器移除時,系統均會調用該方法。例如,被addChildViewController方法添加到父控制器,被UINavigationController控制器使用push方法調用或被作為根視圖控制器時。presentViewController方法不會造成有父子關系的是不會使系統調用這個方法的。且目前視圖控制器調用removeFromParentViewController方法時,該回調方法不會被系統調用,需要手動進行調用,如果未重寫該回調方法,則可以不進行調用。

77.

- (void)didMoveToParentViewController:(nullable UIViewController *)parent

方法類型:動态

參數:1.parent參數為目前視圖控制器的父視圖控制器執行個體,如果沒有則為nil(被移除時)。

傳回值:無。

功能:作用為目前視圖控制器已經被添加到一個視圖控制器中或已經從一個視圖控制器移除時,系統均會調用該方法。和willMoveToParentViewController的區分在于didMoveToParentViewController是視圖控制器被調用并且顯示視圖後才可被調用。但以下的例子代碼不算。不過需要didMoveToParentViewController被觸發的話,可以在addChildViewController後進行手動調用該方法。且目前視圖控制器調用removeFromParentViewController方法時,該回調方法會被系統調用。

IOS 講解 UIViewController對象(九)

這種方式不算,didMoveToParentViewController不會被觸發,但可以觸發willMoveToParentViewController方法

以下介紹的是IOS在應用程式恢複期所用的方法及相關屬性,首先介紹一下什麼叫做應用程式恢複期,就是當程式退到背景經過一段時間被使用的記憶體被系統回收了,造成了再次啟用程式時需要重新加載,但希望讓使用者可以繼續上一次使用時狀态及界面展示,讓使用者可以繼續完成未完成的操作,要達成這個要求,就需要以下的方法屬性的配合。這個方法及屬性主要都存在UIViewController及UIView中,因為界面顯示主要的載體就是它們。

78.

NSString *restorationIdentifier

讀寫,恢複辨別符,作用為是否應保留視圖控制器及其内容,并用于在恢複過程中辨別視圖控制器。預設情況下,此屬性的值為nil,這表示不應儲存視圖控制器。将字元串對象指定給該屬性可以讓系統知道應該儲存視圖控制器。此外,字元串是系統要恢複哪個視圖控制器辨別。

在随後的啟動過程中,系統會幫助程式重新建立上次運作應用程式時設定的視圖控制器。當它請求特定的視圖控制器時,系統會為應用程式提供此恢複辨別符以及視圖控制器層次結構中任何父視圖控制器的恢複辨別符。應用程式必須使用此資訊建立或定位适當的視圖控制器對象。

僅設定此屬性的值不足以確定視圖控制器得到保留和恢複。要恢複的視圖控制器的父視圖控制器也必須具有恢複辨別符。以上内容主要都是蘋果文檔的翻譯,已經解釋的比較清楚了,是以偷懶了~

當然,隻設定了這個值還不足以進行恢複視圖控制器内容,具體的後面會提到。

79.

Class<UIViewControllerRestoration> restorationClass

讀寫,目前視圖控制器在恢複時所用到的恢複對象執行個體。該對象類型不限,隻要對象符合UIViewControllerRestoration協定即可。當恢複時系統會調用該恢複類的viewControllerWithRestorationIdentifierPath(UIViewControllerRestoration協定中的)方法擷取UIViewController執行個體進行恢複。也就是說通過restorationIdentifier屬性确定要恢複哪個UIViewController,通過restorationClass屬性來确定要恢複的具體UIViewController執行個體。

80.

- (void) encodeRestorableStateWithCoder:(NSCoder *)coder

方法類型:動态

參數:1.coder參數為NSCoder對象類型執行個體,用來儲存目前視圖控制器在恢複時需要的資料。

傳回值:無。

功能:作用為當程式要到背景時,視圖控制器需要記錄的一些資料。比如UITableView目前選擇了是哪項?UITabBarController目前顯示的是哪個UIViewController(selectedIndex是幾)?通過coder參數進行儲存。通過當程式切換至背景時,系統會調用這個方法,然後通過重寫這個方法,使用coder參數進行儲存一些界面的狀态資料。這些資料會在以下介紹的恢複方法中進行使用。注意:這裡的儲存不可以長時間的儲存在儲存器中,且僅最為恢複時使用。如果是程式關閉時這些資料是不會儲存的。不要直接調用這個方法,而是交給系統進行調用。最好重寫時最後也要調用父類的該方法,因為有可能父類也要儲存一些狀态資料。

81.

- (void) decodeRestorableStateWithCoder:(NSCoder *)coder

方法類型:動态

參數:1.coder參數為NSCoder對象類型執行個體,在恢複時獲得之前使用encodeRestorableStateWithCoder方法儲存時的資料。

傳回值:無。

功能:作用為當程式切換至前台,且需要恢複之前的界面狀态時,通過系統調用該方法獲得之前使用encodeRestorableStateWithCoder方法儲存的資料,并将目前視圖控制器顯示的狀态按獲得的資料進行設定。例如,UITabBarController的selectedIndex屬性。

82.

- (void) applicationFinishedRestoringState

方法類型:動态

參數:無。

傳回值:無。

功能:作用為當encodeRestorableStateWithCoder被調用,且方法運作完其中的恢複代碼後,系統會調用這個方法。

總結,儲存和恢複還需要在AppDelegate檔案中重寫下圖中的兩個方法,并傳回YES,告訴系統可以使用狀态的儲存和恢複。儲存和恢複的使用方式比較多,尤其是遇到多層級嵌套時需要每個層級都要編寫上面提到的儲存及恢複代碼,不過也可以直接重寫AppDelegate檔案中的- (nullable UIViewController *) application:(UIApplication *)application viewControllerWithRestorationIdentifierPath:(NSArray<NSString *> *)identifierComponents coder:(NSCoder *)coder 方法直接進行建立。這些情況不再一一闡述,甚至在某些情況下,也可以不用系統提供的儲存及恢複的方法,使用我們自定義的方式,也不失為一種簡單且有效的辦法。

IOS 講解 UIViewController對象(九)

繼續閱讀