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

Posted

技术标签:

【中文标题】在 init 方法完成之前调用 UIViewController viewDidLoad【英文标题】:UIViewController viewDidLoad called before init method is complete 【发布时间】:2011-12-11 01:19:45 【问题描述】:

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

这里是代码。 viewDidLoad 在 favoritesTableVC 初始化之前被调用。我可以通过在 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];    

这是调用方法的顺序:

所有结果初始化 resultsTableVC 初始化 所有结果 viewDidLoad addSubview allResultsVC 添加子视图收藏夹结果VC favoritesResultsVC 初始化

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

我在猜测,但你能试试这个吗:

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

看看你是否得到相同的结果。 我的猜测是当时self.view 指向nil。 但这并不能解释为什么 init 会在之后调用......但尝试没有害处。 (我没有测试过)

【讨论】:

猜得好。我正在将此应用程序转换为通用应用程序。重新组织视图和视图控制器将是一件令人头疼的事情。我不确定它为什么会这样做,但我想我现在可以解决这个问题。谢谢。

以上是关于在 init 方法完成之前调用 UIViewController viewDidLoad的主要内容,如果未能解决你的问题,请参考以下文章

在我的 init() 方法中调用视图之前,我的 coreData 没有加载

servlet 核心技术

Servlet有哪些方法?主要作用是啥?

已解决请先调用 init 完成初始化后再调用其他云 API。init 方法可传入一个对象用于设置默认配置,详见文档。; at cloud.callFunction api 解决方案

bean的初始化和销毁

错误:无法在初始化之前调用自动完成的方法;试图调用方法“销毁”