我在正確的地方的問題,從NSNotificationCenterpopViewController,dealloc中和removeObserver
// 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不是唯一的方法,將執行該演示文稿,有更多類似的方法。
任何幫助,建議,歡迎。
問候
感謝您的評論,但我的實際viewcontroller也監聽和響應其他通知消息,而它是在導航堆棧中,無論是否是頂視圖控制器。所以,我寧願將它從通知中心刪除,一旦它不在那裏。 – 2013-05-03 09:42:43
我剛剛更新了我的答案,希望它可以幫助你。 – 2013-05-03 16:59:14