簡體   English   中英

當view屬性沒有設置時,loadView多次調用?

[英]loadView called multiple times when view property not set?

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

- (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]

在loadView方法的開頭添加[super loadView]

將您的代碼放在viewDidLoad中,並注釋loadView方法

您的重寫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];
}

我認為這里有兩點。 首先,我認為你的假設是正確的,因為任何調用視圖的方法都是nil,因此再次請求視圖控制器的視圖。 這將導致它經過-loadView作為記錄為-view的UIViewController中的文檔

至於為什么之后調用-viewDidLoad ,即使它沒有加載視圖; 我想,在-loadView地方,假設視圖已經加載並且之后直接調用-viewDidLoad

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM