在init方法完成之前调用的UIViewController viewDidLoad

时间:2011-12-11 01:19:46

标签: ios uiviewcontroller viewdidload

我有一个视图控制器,初始化另外两个视图控制器。一个控制器的视图没有显示,当我将它添加到超级视图时,我将该问题跟踪为nil的实例。

这是代码。在initialTableVC初始化之前调用viewDidLoad。我可以通过在resultsTableVC和favoritesTableVC视图控制器的初始化方法中放置断点来看到这一点。

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

以下是调用方法的顺序:

  • allResults init
  • resultsTableVC init
  • allResults viewDidLoad
    • addSubview allResultsVC
    • addSubview favoritesResultsVC
  • favoritesResultsVC init

这是一个单线程,所以我不明白在init完成之前如何调用viewDidLoad。

2 个答案:

答案 0 :(得分:1)

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

这将强制allResults控制器加载其视图(当然这会导致viewDidLoad触发)。在您实际从initWithController返回之前,所有这些都是同步发生的:andTableView:

答案 1 :(得分:0)

我猜了,但你可以尝试一下:

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

看看你是否得到了相同的结果 我的猜测是self.view当时指的是nil 但这并不能解释为什么init被召唤......但是没有伤害 (我没有测试过它)