UIViewController viewDidLoad 在 init 方法完成之前调用
我有一个视图控制器,它初始化另外两个视图控制器。一个控制器的视图没有显示,我跟踪问题到实例在添加到超级视图时为零。
这是代码。 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];
}
以下是调用方法的顺序:
- allResults init
- resultsTableVC init
- allResults viewDidLoad
- addSubview allResultsVC
- addSubview favoritesResultsVC
- favoritesResultsVC init
这是一个单线程,所以我不明白在init完成之前如何调用viewDidLoad。
I have a view controller that initializes two other view controllers. The view for one controller wasn't showing, and I tracked the problem to the instance being nil when it's added to the superview.
Here is the code. viewDidLoad is being called before the favoritesTableVC is initialized. I can see this by placing breakpoints in the initialization methods of the resultsTableVC and favoritesTableVC view controllers.
- (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];
}
Here is the order the methods are being called:
- allResults init
- resultsTableVC init
- allResults viewDidLoad
- addSubview allResultsVC
- addSubview favoritesResultsVC
- favoritesResultsVC init
This is a single thread, so I don't understand how viewDidLoad can be called before init is complete.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
-[ResultsTableVC initWithController:andTableView:] 可能引用 allResults.view。
这将强制 allResults 控制器加载其视图(这当然会导致 viewDidLoad 触发)。所有这些都是同步发生的,在您实际从 initWithController:andTableView 返回之前:
-[ResultsTableVC initWithController:andTableView:] is probably referencing allResults.view.
This would force the allResults controller to load its view (which then of course causes viewDidLoad to fire). All of this happens synchronously, before you actually return from initWithController:andTableView:
我正在猜测,但你可以尝试一下吗:
看看是否得到相同的结果。
我的猜测是
self.view
当时指向nil
。但这并不能解释为什么
init
是在之后调用的,但尝试一下也没有什么坏处。(我没有测试过)
I'm taking a guess, but could you try this :
And see if you get the same result.
My guess is that
self.view
is pointing tonil
at that time.But that wouldn't explain why the
init
is call after... but no harm in trying.(I haven't tested it)