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

发布于 2024-12-20 17:40:56 字数 1186 浏览 0 评论 0原文

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

这是代码。 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

如此安好 2024-12-27 17:40:56

-[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:

幽蝶幻影 2024-12-27 17:40:56

我正在猜测,但你可以尝试一下吗:

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

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

I'm taking a guess, but could you try this :

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

And see if you get the same result.
My guess is that self.view is pointing to nil at that time.
But that wouldn't explain why the init is call after... but no harm in trying.
(I haven't tested it)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文