【发布时间】:2013-05-03 06:24:34
【问题描述】:
我在从 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 不是唯一可以进行呈现的方法,还有更多类似的方法。
欢迎任何帮助、建议。
问候
【问题讨论】:
标签: ios objective-c xcode uinavigationcontroller nsnotificationcenter