前言
概述
ViewController是App在iOS系統(tǒng)上運行的必須工具脖捻,也是UIKit框架的基礎(chǔ)組件阔逼,使用它可以不用寫太多代碼就能構(gòu)建出復(fù)雜的用戶界面。當(dāng)你實現(xiàn)自己的ViewController的時候地沮,使用下面的提示和規(guī)范能幫助你避免做出違反系統(tǒng)不期望的行為嗜浮。
盡量使用系統(tǒng)支持的ViewController
許多iOS框架定義了ViewController,你可以在自己的App中使用這些ViewController摩疑。使用系統(tǒng)提供的ViewController可以節(jié)省你的開發(fā)時間危融,并且對用戶而言雷袋,也是一種很舒適的體驗吉殃。
大多數(shù)系統(tǒng)的ViewController使用實現(xiàn)特定功能的。比如有些ViewController用來訪問用戶數(shù)據(jù)如通訊錄、有些ViewController提供訪問硬件的功能蛋勺、有些ViewController提供訪問多媒體的功能瓦灶,比如說UIKit框架中的UIImagePickerController類可以訪問用戶的相冊,來展示一個標(biāo)準(zhǔn)的圖片或者視頻交互界面抱完。
在創(chuàng)建自己的ViewController之前贼陶,先確定一下現(xiàn)有的框架中是否包含ViewController可以用完成你的開發(fā)任務(wù)。
- UIKit框架提供了彈出框巧娱、調(diào)用相機(jī)和視頻碉怔、管理iCoud上的文件等類型的ViewController。UIKit框架中還提供了許多容器類型的ViewController禁添,你可以使用他們來組織你的內(nèi)容
- Gamekit框架提供了玩家匹配撮胧、排行榜、成就和其他具有游戲特性的ViewController上荡。
- Address Book UI 框架提供了展示和選擇聯(lián)系人的ViewController趴樱。
- MediaPlayer框架提供了播放和管理視頻的ViewController,還有選擇媒體資源的ViewController酪捡。
- EnventKit框架提供了展示和編輯用戶日歷的的ViewController叁征。
- GLkit框架提供了管理OpenGL渲染曲面的ViewController。
- Multipeer Connectivity框架提供了檢測其他用戶并邀請他們連接的ViewController逛薇。
- Message UI框架提供了構(gòu)成電子郵件和短信的ViewController捺疼。
- PassKit框架提供了展示憑證和將憑證添加到存折的ViewController。
- Social框架提供了向Twitter永罚、facebook和其他社會化媒體網(wǎng)站分享信息的UI啤呼。
- AVFoundation框架提供了展示媒體資源的ViewController。
注意:不要去視圖修改系統(tǒng)提供的ViewController的視圖層級結(jié)構(gòu)呢袱。每個ViewController有其自己的視圖層級結(jié)構(gòu)官扣,并負(fù)責(zé)維持其層級結(jié)構(gòu)的完整性。進(jìn)行修改可能引發(fā)bug或者不能正確的顯示ViewController羞福。在有些系統(tǒng)提供的ViewController中惕蹄,可以依據(jù)其提供的公開方法或者屬性來做響應(yīng)的修改。
關(guān)于更多特定功能的ViewController治专,請參考相應(yīng)框架的參考文檔卖陵。
保證ViewController之間的隔離
ViewController應(yīng)當(dāng)是自足型對象。沒有ViewController可以了解到另一個ViewController的內(nèi)部工作和它的視圖層級张峰。當(dāng)兩個ViewController需要通信或者傳遞數(shù)據(jù)的時候泪蔫,應(yīng)該使用它們給定的公共接口。
代理模式在管理兩個ViewController之間通信的時候經(jīng)常用到喘批。在代理模式下撩荣,一個ViewController定義與相關(guān)交互代理對象相關(guān)協(xié)議铣揉,代理對象實現(xiàn)這個協(xié)議。代理對象的類型不需要確切的類型婿滓,重要的是它實現(xiàn)了協(xié)議方法老速。
將ViewController的根視圖作為其他視圖的容器
使用ViewController的根視圖最為其他內(nèi)容的容器。使用根視圖作為容器可以給其他所有的View一個公共的父視圖凸主,這使得許多布局操作變得非常簡單橘券。許多自動布局約束需要共同的父視圖來設(shè)置視圖的屬性。
了解數(shù)據(jù)的流向
在模型-視圖-控制器的設(shè)計模式下卿吐,ViewController的角色是促進(jìn)數(shù)據(jù)在模型對象和視圖對象之間流動旁舰。ViewController可能在臨時變量中存儲一些數(shù)據(jù),并且執(zhí)行一些校驗嗡官,但是ViewController的主要職責(zé)是確保視圖的包含準(zhǔn)確的信息箭窜。數(shù)據(jù)對象的責(zé)任在于管理真實的數(shù)據(jù)和確保數(shù)據(jù)的完整性。
視圖和數(shù)據(jù)分離的一個例子是衍腥,UIDocument類與UIViewController類的關(guān)系磺樱。這兩個類默認(rèn)沒有任何關(guān)系。一個UIDocument對象作用是加載和報錯數(shù)據(jù)婆咸,而UIViewController的作用是將視圖展示的屏幕上竹捉。如果你要使用這兩個對象,需要注意的是尚骄,ViewController只需要從document對象中獲取有效的對象即可块差。真實的數(shù)據(jù)仍然屬于document對象。
適應(yīng)屏幕的變化
Apps可以運行在不同的iOS設(shè)備上倔丈,并且ViewController設(shè)計的時候已經(jīng)適配了不同尺寸的屏幕憨闰。不需要在不同的設(shè)備上使用不同ViewController,而是使用ViewController內(nèi)置的適配器去適配不同的尺寸和尺寸的變化需五。UIKit發(fā)送的通知讓您有機(jī)會對用戶界面進(jìn)行大規(guī)模和小規(guī)模的更改鹉动,而無需更改視圖控制器代碼的其余部分。
關(guān)于更多屏幕適配的信息宏邮,請參考The Adaptive Model泽示。