gpt4 book ai didi

ios - popViewController、dealloc 和 removeObserver

转载 作者:行者123 更新时间:2023-11-29 11:00:03 27 4
gpt4 key购买 nike

我遇到了从 NSNotificationCenter 中删除观察者的正确位置的问题

// DetailOfSomethingViewController
@implementation DetailOfSomethingViewController

- (void)viewDidLoad {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(showMoreDetail:)
name:SOME_NOTIFICATION_NAME
object:sender];
}

- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)showMoreDetail:(id)sender {
[self presentViewController:[[MoreDetailViewController alloc] init] animated:NO completion:nil];
}

在我的测试运行期间,我尝试从导航堆栈中弹出此 viewController 的实例并将新实例推送到堆栈中。我发现从导航堆栈中弹出的实例的 dealloc 方法不会立即被调用。

因此,在 dealloc 被调用之前的那一刻,如果 SOME_NOTIFICATION_NAME 已从其源发出,弹出的实例仍在监听并通过调用 showMoreDetail 进行响应(注意:导航堆栈上的那个工作正常)并尝试呈现一个MoreDetailViewController 而不是在应用程序窗口中。所以这个警告已经提出。

Warning: Attempt to present <DetailOfSomethingController: 0xac2c3e0> on <MoreDetailViewController: 0xac268f0> whose view is not in the window hierarchy!

我可以检查 View Controller 实例的导航堆栈是否存在,但是是否有任何正确的方法可以在弹出时立即删除观察者?我不能将删除代码放在 viewDidDisappear 或 viewWillDisappear 中,因为必须通知此 Controller 并执行某些操作,即使它不是堆栈的 topViewController。

此外,添加代码以在呈现另一个 View 之前检查必须添加此 Controller 内的几个位置,因为 showMoreDetail 不是唯一的方法,可以进行呈现,还有更多类似的方法。

欢迎任何帮助和建议。

问候

最佳答案

showMoreDetail: 中检查 UINavigationController 的 topViewController 属性是否等于 self,如果等于则继续。

关于ios - popViewController、dealloc 和 removeObserver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16352895/

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