2011-02-02 47 views
5

我剛剛遇到了一些我以前沒見過的東西,我想我會在這裏要求驗證原因。我有一個UIController,它的視圖是以編程方式定義的,我今天注意到,當我從它的loadView中註釋代碼(以測試其他內容)時,loadView和viewDidLoad都被調用了四次。我的想法是,因爲我沒有設置視圖屬性iOS多次嘗試加載視圖,但我仍然有點好奇,如果這是爲什麼viewDidLoad也被稱爲。當視圖屬性未設置時,多次調用loadView?

- (void)loadView { 
    NSLog(@"%s", __PRETTY_FUNCTION__); 

    // MAP VIEW 
    // MKMapView *tempMapView = [[MKMapView alloc] init]; 
    // [tempMapView setDelegate:self]; 
    // [self setView:tempMapView]; 
    // [self setCustomMapView:tempMapView]; 
    // [tempMapView release]; 
} 

控制檯輸出:

2011-02-02 14:10:00.194 Xrails[19501:307] -[MapController loadView] 
2011-02-02 14:10:00.209 Xrails[19501:307] -[MapController viewDidLoad] 

2011-02-02 14:10:00.212 Xrails[19501:307] -[MapController loadView] 
2011-02-02 14:10:00.226 Xrails[19501:307] -[MapController viewDidLoad] 

2011-02-02 14:10:00.229 Xrails[19501:307] -[MapController loadView] 
2011-02-02 14:10:00.243 Xrails[19501:307] -[MapController viewDidLoad] 

2011-02-02 14:10:00.246 Xrails[19501:307] -[MapController loadView] 
2011-02-02 14:10:00.259 Xrails[19501:307] -[MapController viewDidLoad] 
+0

我還登錄自己在的loadView確保那些確實來自同一個MapController – nduplessis 2011-02-02 15:35:22

回答

1

我覺得這裏有兩點。首先,我認爲你的假設是正確的,因爲無論什麼呼籲的觀點是無法回頭,並再次要求視圖控制器的觀點。這導致它通過-loadView,如documentation for UIViewController中的-view所述。

至於爲什麼-viewDidLoad後來被調用,即使它沒有加載視圖;我想,在-loadView被調用的地方,假設視圖已經被加載,並且之後直接調用-viewDidLoad

無論哪種方式,如果您自己實施-loadView,則必須在其末尾有有效的視圖。

2

把你的代碼中viewDidLoad中,和評論的loadView方法

+0

未來當我取消註釋代碼時,它工作正常,我只是好奇發生了什麼。 loadView似乎是創建視圖項目的正確位置,因爲我不使用* .xib – fuzzygoat 2011-02-02 14:43:49

+0

self.view屬性訪問器在視圖當前未加載時調用-loadView。可能會發生無限遞歸。 – iHS 2011-02-02 15:11:36

9

添加[超級的loadView]在的loadView方法開始

1

你的loadView覆蓋必須分配一個以self.view

- (void)loadView 
{ 
    self.view = [UIView new]; 
} 

每文檔在https://developer.apple.com/documentation/uikit/uiviewcontroller/1621454-loadview

您可以以手動創建你的意見重寫此方法。如果您選擇這樣做,請將視圖層次結構的根視圖分配給 視圖 屬性。您創建的視圖應該是唯一的實例,不應與任何其他視圖控制器對象共享。您自定義的此方法實現不應該調用super。

大概有幾個地方在UIKit的深跌,其中像這樣被調用:

if (viewController.view == nil) { 
    [viewController loadView]; 
} 
相關問題