1

我在正確的地方的問題,從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不是唯一的方法,將執行該演示文稿,有更多類似的方法。

任何幫助,建議,歡迎。

問候

回答

1

我給你的建議是,註冊您的viewController作爲viewWillAppear中的觀察員:刪除viewWillDisappear:

這樣,當它是頂部的viewController視圖將只響應。

UPDATE:

我覺得你可以做的是該通知寄存器只出現時認爲:

- (void)viewWillAppear:(BOOL)animated{ 

    [super viewWillAppear:animated]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(showMoreDetail:) 
              name:SOME_NOTIFICATION_NAME 
              object:sender]; 
} 

以及用於去除您的視圖控制器作爲觀察員做同樣的(只是爲了通知,它仍然會聽取其他通知)

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:SOME_NOTIFICATION_NAME 
                object:nil]; 

} 
+0

感謝您的評論,但我的實際viewcontroller也監聽和響應其他通知消息,而它是在導航堆棧中,無論是否是頂視圖控制器。所以,我寧願將它從通知中心刪除,一旦它不在那裏。 – 2013-05-03 09:42:43

+0

我剛剛更新了我的答案,希望它可以幫助你。 – 2013-05-03 16:59:14

1

showMoreDetail:檢查UINavigationController的topViewController屬性是否等於self,如果只有這樣,則繼續。

+0

感謝您的評論,但我在我的問題中指出,添加一組代碼來檢查導航堆棧中是否存在此viewcontroller並不是首選項。我的實際viewcontroller正在偵聽並響應超過10個通知。所以,我寧願將它從Notification Center中刪除。 – 2013-05-03 09:40:55