在 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 没有加载
已解决请先调用 init 完成初始化后再调用其他云 API。init 方法可传入一个对象用于设置默认配置,详见文档。; at cloud.callFunction api 解决方案