loadView學習總結

2021-06-21 11:30:43 字數 2390 閱讀 1171

uiviewcontroller類或其子類會在初始化時建立乙個uiview物件,會作為控制器的預設檢視顯示出來,可以通過self.view定址訪問。但沒有呼叫loadview方法時,self.view=nil。loadview在每一次使用self.view這個property,並且self.view為nil的時候被呼叫,用以產生乙個有效的self.view。這個介面原本是為了讓我們自定義view用的。你在控制器中實現了loadview方法,那麼你可能會在應用執行的某個時候被記憶體管理控制呼叫。 如果裝置記憶體不足的時候, view 控制器會收到didreceivememorywarning的訊息。 預設的實現是檢查當前控制器的view是否在使用。 如果它的view不在當前正在使用的view hierarchy裡面,且你的控制器實現了loadview方法,那麼這個view將被release, loadview方法將被再次呼叫來建立乙個新的view。

[super loadview]的效果,就是產生了乙個有效的view,也就是乙個空白的view來保證view在使用時不為nil,但這並不是cocoa的設計者所期望的。

loadview僅僅應該在開發者希望自行通過編碼而不是inte***ce builder定製view的時候被實現,而且不應該在其中呼叫[super loadview],你的loadview中應該有self.view = …這樣的行為。

看兩個例子:

例子1、

-(void) loadview {

//[super loadview];

nslog(@"loadview called");

- (void) viewdidload {

[super viewdidload];

uibutton *custombutton = [uibutton buttonwith.....

[self.view addsubview:custombutton];

當不使用ib來建立檢視的時候,在viewdidload中使用view之前,系統會自動呼叫loadview來建立乙個view,但例子1中的loadview除了列印一句話之外什麼都沒乾,所以loadview會被不同的呼叫,但程式仍不能正常執行,因為沒有有有效的view,self.view的值始終為nil。注意:我沒有呼叫[super loadview],如果加上這句就可以了,這樣會產生乙個空白的view,但這不是蘋果希望的。

例子2、

- (void)loadview

[super loadview];

textview.text=@"hello";

[self.view addsubview: textview];

- (void)loadview

textview.text=@"hello";

self.view=textview;

兩段**起到的作用相同,但前乙個例子把textview加入到self.view中,而後者則讓self.view直接指向了 textview。把textview加入到self.view中則self.view不能為nil,因此需要呼叫[super loadview]方法,後者不需要。

顯然,繼承uiviewcontroller的subclass要實現其load方法時,若採用新增view的方式,我們只要在loadview中增加一句[super loadview]就沒有問題了。但這並不是cocoa的設計者所期望的。self.view = …才是提倡的方式。

看了一些大俠的帖子,有這麼說的:

{當view需要被展示而它卻是nil時,viewcontroller會呼叫該方法。不要直接呼叫該方法。

如果手工維護views,必須過載重寫該方法

如果使用ib維護views,必須不能過載重寫該方法}

開始時對上述感覺很迷惑,我想這不是他想表達的本意

self.view = [[[nsbundle mainbundle] loadnibnamed:@"onenibname" owner:self options:nil] lastobject];

我想在loadview中這樣用也是可以的,我是手工維護view,但view是從ib中載入的。

還有一點,和loadview乙個界別的還有乙個方法initwithnibname,這個方法是在controller中的類在ib中建立,但是通過xcode例項化controller的時候用的.(建立乙個viewbase的模板工程,然後開啟mainwindow.xib,刪除其中的viewcontroller,然後回到viewcontroller.m中,把第乙個方法initwithnibname注釋取消掉,然後加入一條你喜歡的列印語句,試試是不是這樣的)

一般的用法是在loadview/initwithnibname裡面建立基本的介面,然後在viewdidload裡讀入資料,然後根據資料再將各view設定為正確的狀態。

上述為個人參考網上資料學習後的個人理解,有錯誤的地方還望飄過的大俠批評指正,在此謝過。

loadView學習總結

uiviewcontroller類或其子類會在初始化時建立乙個uiview物件,會作為控制器的預設檢視顯示出來,可以通過self.view定址訪問。但沒有呼叫loadview方法時,self.view nil。loadview在每一次使用self.view這個property,並且self.view...

loadView學習總結

uiviewcontroller類或其子類會在初始化時建立乙個uiview物件,會作為控制器的預設檢視顯示出來,可以通過self.view定址訪問。但沒有呼叫loadview方法時,self.view nil。loadview在每一次使用self.view這個property,並且self.view...

重寫了loadView,一般用在什麼地方

如果不實現loadview方法,控制器預設有乙個loadview方法,預設系統怎麼載入控制器的view呢,先去storyboard裡面找,沒有找到 再去與控制器名稱相同的xib裡面找,沒有找到,在去名稱相同去掉controller的xib 裡面找,還沒有找到,程式設計師也沒有重寫loadview方法...