gpt4 book ai didi

ios - View Controller 容器偶尔会错过子 Controller 中的 viewWillAppear

转载 作者:行者123 更新时间:2023-11-29 10:43:38 25 4
gpt4 key购买 nike

我有一个带有 subview 的 Root View Controller 作为 subview Controller View 的包装器。基本思想是我的根 Controller 有一个左右 View Controller ,都显示在屏幕上(类似于 splitviewcontroller)。加载时,模态视图会在 Root View Controller 上弹出并询问详细信息。然后模态视图联系服务器,并在得到响应后被关闭。根 Controller 然后使用以下代码添加 subview Controller :

[self addViewController:self.leftViewController];
[self addViewController:self.rightViewController];

[self addView:self.rightViewController.view ToWrapper:self.rightViewWrapper];
[self addView:self.leftViewController.view ToWrapper:self.leftViewWrapper];

添加 View Controller 的地方:

[self addChildViewController:controller];
[controller didMoveToParentViewController:self];

addViewToWrapper 只是将 View Controller 的 View 添加到 rootViewController 的相关 subview 中,如下所示:

[[viewWrapper.contentView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
newSubview.frame = viewWrapper.contentView.bounds;
newSubview.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[viewWrapper.contentView addSubview:newSubview];

99% 的时间都可以正常工作。两个 View 都会立即出现,并且 viewWillAppear 在两个子 Controller 中都会触发。但是,有时屏幕会在短时间内保持白色,并且 viewWillAppear 不会在右 View Controller (编辑:和左 View )中触发。所有其他 View 生命周期方法都会触发,只是 viewWillAppear 不会触发。

不幸的是,我无法提供整个类(class)的代码,因为它很复杂且专有。但是,此间歇性行为的描述中是否有任何线索?

最佳答案

一些想法:

一个

看起来您的收容方法没有被正确调用。对于每个 viewController,它们应该如下所示:

    [self addChildViewController:controller];
[self.view addSubview:controller.view];
[controller didMoveToParentViewController:self];

应在 addChilddidMove 调用之间将 View 添加到父 View 。

两个

据我所知,一次不能有超过一次的演示或解雇。 IE。如果您试图在模态被取消的同时显示(添加)您的 subview Controller ,您将在控制台日志中看到错误,并且您的“添加”操作将不会发生。

我的建议是在模态视图 Controller 上创建一个委托(delegate)协议(protocol)。在 dismissViewControllerAnimated:completion: 的完成 block 中,调用您的委托(delegate)方法:

[self dismissViewControllerAnimated:YES completion:^{
if ([weakSelf.delegate respondsToSelector:@selector(settingsViewControllerDidDismiss:)])
{
[weakSelf.delegate settingsViewControllerDidDismiss:self];
}
}];

在您的 rootViewController 中,您将开始在 settingsViewControllerDidDismiss 或您决定调用该方法的任何内容中添加其子项。关键是“添加”操作在解雇操作之后开始。

希望这对您有所帮助。

关于ios - View Controller 容器偶尔会错过子 Controller 中的 viewWillAppear,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23249867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com