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