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的物件。
沒有留言:
張貼留言