翻译关于ViewController的一篇文章
翻譯蘋果官網的文章一則
https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ViewLoadingandUnloading/ViewLoadingandUnloading.html
?
初始化 ViewController
第一次實例化的時候,通過生命周期創建或者加載對象,它不應該創建view?hierarchy 或者其他跟顯示畫面相關的內容,它應該關注對象,關注實現生命周期中特殊行為的對象。
?
初始化storyboard中加載的ViewController
當我們在storyboard中創建view controller時,配置的屬性都會存儲到一個配置信息文檔中,之后當實例化時,文檔就會被加載到內存和進程中去,結果就是會有一系列的符合之前配置信息的對象會生成,配置信息文檔會被view controller的initwithcode:方法加載。這之后任何實現了awakeFromNib方法的對象調用這個方法。用這個方法配置信息。
?
用代碼初始化ViewController
如果view controller用代碼創建的,那么我們重寫一下init方法,當然這個方法首先要調用父類的init方法,然后再加上自己的其他客戶化的內容。
通常,實例化方法里面不要寫過于復雜的方法,而是應該實現簡單的功能,并且提供必要的屬性給view controller的委托類從而配置它的行為。
?
ViewController?當訪問VIEW屬性時會實例化它的VIEW Hierarchy。
無論何時當你的app需要訪問view,而view對象不在內存中時,view controller都會加載view?hierarchy
進內存,并且存儲在它的view屬性內,循環加載的步驟如下:
1、view?controller 調用自己的loadview方法。方法默認會實現下面的某一個內容:
* 如果view?controller關聯了一個storyboard,那么就從storyboard中加載。
* 如果沒有關聯的故事模板,那么會創建一個空的UIView對象,并且賦值給view屬性。
2、view?controller調用viewDidLoad方法,這能夠確保你的子類能夠執行額外的load-time任務。
下面的圖示展示了view?controller是如何循環加載的,包含了一些需要調用的方法。我們的app可以覆蓋loadview方法和viewDidLoad方法。舉個例子,如果你的app沒有用storyboard,但是你卻想增加一個view,這時可以覆蓋loadview方法用代碼初始化view。
下面這個圖的標題是:向內存中加載view
?
?
從storyboard中加載一個view
?
大多數的view controller 從storyboard中加載他們的view,優點就是可以用可見的方式配置布局,這很容易也很快速。
在interface builder中創建view
interface builder是xcode的一部分,他可以給我們的viewcontroller提供方便的直觀的方式去配置view的相關屬性。在這里可以同時操控view和controller,控件直接拽到工作空間中,設置大小,屬性等,設置完畢后直接存儲在storyboard文件中。
?
在interface builder中配置view的圖形屬性
為了正確的展示內容布局,interface builder提供了控件可以讓你去指定是否view有導航bar、工具bar等其他的對象,這些對象都可以影響你的定制內容。如果controller連接到容器中,也可以提供精確的運行時的顯示效果。
?
為view controller配置Action和Outlet
利用IB,可以在view和controller之間建立連接。
下面的代碼顯示如何聲明一個MyVIewController類的controller以及它的兩個custom outlet 和一個 ibaciton方法。這個聲明其實是在.m文件內的category。outlets存儲了一個按鈕和一個textfield引用。下面的方法則監聽按鈕的按下動作。
?
| @interface MyViewController() ? |
| @property (nonatomic) IBOutlet id myButton; ? |
| @property (nonatomic) IBOutlet id myTextField; ? |
| ? ? |
| - (IBAction)myAction:(id)sender; ? |
| @end |
?
而下面的圖示則展示了上面代碼部分建立的對象之間的連接
?
?
接下來介紹一下代碼的方式創建視圖(view)//1??
如果你更喜歡用代碼來創建視圖,應該覆蓋你的view controller 的loadview方法,你的方法實現應該遵從以下的幾點:
?
1、創建一個根視圖對象。
根視圖內包含所有跟view controller有關的所有視圖,通常會給根視圖定義一個frame去匹配app window的size,frame應該是布滿整個屏幕的。然而frame會根據你的view controller來調整它的display1??。這個根視圖可以是普通的UIView,也可以是自己的客戶化的view,或者任何其他可以鋪滿屏幕的view。
2、創建子視圖并且加入到根視圖內
對于每個子視圖都應該創建并且初始化,然后用addSubview:方法加入到父視圖中去。
3、如果用了自動旋轉布局模式,應該給每個視圖配置足夠多的位置限定條件。并且還要實現兩個方法:viewWillLayoutSubviews和viewDidLayoutSubview來調整子類的frame。
4、添加根視圖到view controller的property中。
下面的代碼展示了如何創建視圖和子視圖
| - (void)loadView ? |
| { ? |
| ? ? CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame]; ? |
| ? ? UIView *contentView = [[UIView alloc] initWithFrame:applicationFrame]; ? |
| ? ? contentView.backgroundColor = [UIColor blackColor]; ? |
| ? ? self.view = contentView; ? |
| ? ? |
| ? ? levelView = [[LevelView alloc] initWithFrame:applicationFrame viewController:self]; ? |
| ? ? [self.view addSubview:levelView]; ? |
| } |
?
Note:?When overriding the?loadView?method to create your views programmatically, you should not call?super. Doing so initiates the default view-loading behavior and usually just wastes CPU cycles. Your own implementation of the?loadView?method should do all the work that is needed to create a root view and subviews for your view controller. For more information on the view loading process, see?“A View Controller Instantiates Its View Hierarchy When Its View is Accessed.”
注意:用代碼覆蓋loadView方法去新建視圖時,不可以調用super.初始化默認的view-loading行為,這通常會引起cpu的運行浪費。你自己的loadview方法的實現應該做所有需要的工作。
?
轉載于:https://www.cnblogs.com/qiqingnan/p/3764110.html
總結
以上是生活随笔為你收集整理的翻译关于ViewController的一篇文章的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Myeclipse开发内存溢出问题
- 下一篇: HelloX项目github协同开发指南