code

2017年10月29日 星期日

Stanford ios 10 with Swift 筆記5 - Chain of MVCs & Viewcontroller life cycle

MVCs of MVCs

某個MVC的view,邏輯可責任可以放在另一組MVC上,例如以下例子:



TabController負責切換每個tabicon所代表的view,但是每個被切換的view怎麼運作則是相對應的MVC來負責(畫出黃色的區域,以及互動邏輯)。

所以這個UI總共有五個MVCs(包括Tab bar MVC):



下面的UISplitViewController有三個MVCs (包括UISplitViewController):



 下面這個UINavigationController有兩個MVCs,上方area是由UINavigationController畫出,其他則是被包含的SettingsVC畫出:



Segue

發音就是滑板車segway。

UINavigationController是stack-based 來儲存每個要畫出的MVC,push and pop。
每次push或是pop一個MVC,這個動作稱為segue。
注意每個push進來的MVC是allocated in heap,而整個navigation的邏輯是stack
當然如果popped,就會deallocated。

基本上從一個MVC移到另一個MVC就叫做segueing。



seque有一些方法要去override,用來決定下一個進來的MVC要做些什麼事。


ViewController Life Cycle

(記得永遠都要呼叫super.xxxx())


1. creation: 通常由storyboard創造instance
2. preparation: 如果是由sequed,就會進入preparation。
3. outlet setting
4. viewDidLoad() : 進入這邊確定了所有的outlet set,所以適合做ViewController的setup / initialization,但是不要做任何關於geometry / device-specific的計算

viewWillAppear() : 在進入前景前會呼叫的callback,這邊可以做關於model modification的事情(例如重新從遠端抓資料),因為許多MVCs只需要在畫在前景時去update。另外由於這邊確定要畫在螢幕上了,所以computation expensive也可以考慮放在這邊(看情況也可以放在viewDidAppear)。

viewWillDisappear(): 可以做一些clean up動作,但是也要看情況是否做computation expensive (通常不會clean up還需要大量計算)。



Geometry changed

view bounds不能在viewWillAppear / viewDidAppear 確定,所以不要在此兩個callback使用。通常我們依賴autolayout去設定geometry,不會直接coding相關設定。

不過如果真的要做geometry computation的話,當view bounds/frame改變的時候(例如rotation,但不止bound/frame改變才會觸發,有很多可能會觸發這個callback),會經歷以下callbacks:

viewWillLayoutSubviews()
.. AutoLayout在此中間時刻發生 ..
viewDidLayoutSubviews()

如果想要參與rotation animation,則可以使用 viewWillTransition 這個callback。

Memory Low

則didReceiveMemoryWarning 這個callback會被呼叫。
在app中最好盡量去release站著大量記憶體,但是可以快速allocate / deallocate的物件。


Life Cycle Summary




沒有留言:

張貼留言