就iOS開發來說,UIViewController就最核心的類型之一。而iOS的整個UI開發的核心思想也是MVC的架構,從UIViewController的命名就可以看出它在MVC中所扮演的角色,那就是Controller啦。
Controller作為整個UI視圖的控制器,對於用戶的輸入做出邏輯處理,例如用戶點擊某個按鈕應該執行什麼操作等;View角色只負責顯示視圖,view的這部分就是我們在nib或者storyboard設計的UI了。Model也就是我們的數據模型,例如從Core data中加載的實體類等等。這整個架構分工清晰,降低了代碼的耦合度。今天我們要學習的角色就是Controller。
UIViewController與UIWindow、UIView的關系如下 圖所示:
vc+1zaGjPC9wPjxwPgmwtNXVudm3vbXEtqjS5aOsVmlldyBDb250cm9sbGVyzqppT1PM4bmpwcu7+bShtcTK0828udzA7cSj0M2jrNKyvs3Kx8v8vs3Kx7i61PC53MDtytPNvLXEo6y53MDtytPNvLXEsuO8tqGitPPQoaGixNrI3aGivbu7pbXIoaNpT1O1xFNES9bQzOG5qbrctuDUrcn6Vmlld0NvbnRyb2xsZXKjrNLU1qez1rHq17y1xNPDu6e958Pmo6zA/cjnse3K0828v9jWxsb3o6hVSVRhYmxlVmlld0NvbnRyb2xsZXKjqaGitby6vb/Y1sbG96OoVUlOYXZpZ2F0aW9uQ29udHJvbGxlcqOpoaKx6sepwLi/2NbGxvejqFVJVGFiYmFyQ29udHJvbGxlcqOpus1pUGFk16jT0LXEVUlTcGxpdFZpZXdDb250cm9sbGVytcihozwvcD48cD48YnIgLz48L3A+PHA+ICAgICAgICCwtL3hubm/ydLUttRpT1O1xMv509BWaWV3Q29udHJvbGxlcrfWs8nBvcDgo7o8L3A+PHA+ICAgICAgICAxoaI8c3Ryb25nPtb30qrTw9Pa1bnKvsTayN21xFZpZXdDb250cm9sbGVyPC9zdHJvbmc+o6zV4tbWVmlld0NvbnRyb2xsZXLW99Kq08PT2s6q08O7p9W5yr7E2sjdo6yyotPr08O7p727u6WjrMjnVUlUYWJsZVZpZXdDb250cm9sbGVyo6xVSVZpZXdDb250cm9sbGVyoaM8YnIgLz4gICAgICAgIDKhojxzdHJvbmc+08PT2r/Y1sa6zc/Uyr7G5Mv7Vmlld0NvbnRyb2xsZXK1xFZpZXdDb250cm9sbGVyPC9zdHJvbmc+oaPV4tbWVmlld0NvbnRyb2xsZXLSu7DjtrzKx9K7uPZWaWV3Q29udHJvbGxlcrXEyN3G96OswP3I51VJTmF2aWdhdGlvbkNvbnRyb2xsZXKjrFVJVGFiYmFyQ29udHJvbGxlcqOsy/zDx7a809DSu7j2yvTQ1KO6dmlld0NvbnRyb2xsZXJzo6y9q8v509DSqrncwO21xFZpZXcgQ29udHJvbGxlcsztvNO1vbjDyv3X6b7Nvs3Q0MHLo6zI5828MaGjxuTW0FVJTmF2aWdhdGlvbkNvbnRyb2xsZXKx7cq+0rvW1lN0YWNryr294bm5o6xwdXNo0ru49lZpZXdDb250cm9sbGVyu/Jwb3DSu7TOo6y1scewVmlld0NvbnRyb2xsZXK1xLW8ur3AuMnPu+HP1Mq+yc/Su7j2Vmlld0NvbnRyb2xsZXK1xEJhciBCdXR0b26jrLXju/e4w2JhciBidXR0b26/ydLUt7W72MnP0ru49lZpZXcgQ29udHJvbGxlcqGjtvhVSVRhYmJhckNvbnRyb2xsZXKx7cq+0ru49rT409C117K/wLi1xMrTzby/2NbGxvejrLXXsr/AuLC0xaW1xLj2yv2+zcrHVmlld0NvbnRyb2xsZXK1xLj2yv2jrLj3uPZWaWV3Q29udHJvbGxlcsrHsqLB0LXEo6zI5828MqGjPC9wPjxwPjxiciAvPjwvcD48cD4gICAgICAgICAgICAgICAgICAJCQk8aW1nIHNyYz0="/uploadfile/Collfiles/20141202/20141202081454107.png" alt="\" width="300" height="534" />
圖1 圖2
UIViewController有兩種加載方式,第一種是通過手動加載xib文件來加載視圖,第二種是直接通過代碼來創建View Controller中的師徒來加載。直接看示例吧。
方式一 :xib加載
在創建一個xib文件,將File's Owner設置為對應的UIViewController類型,然後關聯File's Owner的view與xib中的root view(在創建UIViewController時自動創建了xib的話不需要這一步,只有分開創建時才需要手動建立關聯,否則會報錯。),然後通過如下代碼即可創建:
// MainViewController *vc=[[MainViewController alloc]initWithNibName:@"MainViewController" bundle:nil]; // self.window.rootViewController = vc; MainViewController *vc=[[MainViewController alloc] init]; self.window.rootViewController = vc;
方式二:代碼添加View
思路就是將View添加到UIViewController的root view中,在UIViewController啟動時默認會從與其關聯的xib或者storyboard中加載視圖,如果沒有找到則root view為nil。我們可以覆寫loadView方法,通過代碼的形式向裡面添加view。代碼如下 :
// 加載視圖時繪制 -(void) loadView { UILabel* label = [[UILabel alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] ; label.text = @"Draw The Text"; label.backgroundColor = [UIColor redColor] ; self.view = label; }然後直接通過alloc和init創建UIVIewController即可。
ViewController生命周期會經歷初始化、加載視圖、銷毀視圖、生命結束等過程。
1)init方法
初始化ViewController本身。
2)loadView方法
當view需要被展示而它卻是nil時,viewController會調用該方法,如果代碼構建View的話需要重寫此方法。
3)viewDidLoad方法
執行完loadView後繼續執行viewDidLoad,loadView時還沒有view,而viewDidLoad時view已經創建好了。
4)viewDidUnload方法
當系統內存吃緊的時候會調用該方法。
5)dealloc
釋放其他資源或內存。