簡體   English   中英

在初始化方法完成之前調用的UIViewController viewDidLoad

[英]UIViewController viewDidLoad called before init method is complete

我有一個視圖控制器,可以初始化其他兩個視圖控制器。 沒有顯示一個控制器的視圖,並且我將問題跟蹤到實例添加到超級視圖時為零。

這是代碼。 在初始化favoriteTableVC之前,將調用viewDidLoad。 通過在resultTableVC和favoriteTableVC視圖控制器的初始化方法中放置斷點,可以看到這一點。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        resultsTableVC = [[[ResultsTableVC alloc] initWithController:self andTableView:nil] retain];
        favoritesTableVC = [[[FavoritesTableVC alloc] initWithFrame:CGRectMake(0, 10, self.view.frame.size.width, defaultFavoritesTableHeight) andController:self] retain];        
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.view addSubview:resultsTableVC.view];
    [resultsTableVC release];
    [self.view addSubview:favoritesTableVC.view];
    [favoritesTableVC release];    
}

方法被調用的順序如下:

  • allResult初始化
  • resultsTableVC初始化
  • allResults viewDidLoad
    • addSubview allResultsVC
    • addSubview favoriteResultsVC
  • favoriteResultsVC初始化

這是一個單線程,所以我不了解在初始化完成之前如何調用viewDidLoad。

-[ResultsTableVC initWithController:andTableView:]可能引用了allResults.view。

這將迫使allResults控制器加載其視圖(這當然會導致viewDidLoad觸發)。 所有這些都是同步發生的,實際上是您從initWithController:andTableView返回之前:

我正在猜測,但您可以嘗試以下方法:

favoritesTableVC = [[[FavoritesTableVC alloc] initWithFrame:CGRectMake(0, 10, SOME_HARD_CODED_INT, SOME_HARD_CODED_INT) andController:self] retain]; 

並查看是否得到相同的結果。
我的猜測是self.view當時指向nil
但這並不能解釋為什么init是在之后調用的,但是嘗試時沒有害處。
(我還沒有測試)

暫無
暫無

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

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