我在从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!

我可以检查视图控制器实例的导航堆栈上是否存在,但是是否有任何适当的方法可以在弹出观察器时立即删除观察器?我无法将删除代码放入viewDidDisappear或viewWillDisappear中,因为必须通知此控制器并执行某些操作,即使它不是堆栈的topViewController。

另外,在显示另一个视图之前添加代码以进行检查,必须在此控制器内的多个位置添加代码,因为showMoreDetail并不是唯一可以进行演示的方法,还有更多类似的方法。

任何帮助,建议都欢迎。

问候

最佳答案

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

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

10-13 04:36