2011-02-13 33 views
0

我創建了一個單例類來存儲對CLLocationManager的引用,所以我的整個程序訪問同一對象並充當委託。使用單例將通知發佈到特定對象

我使用TabBarController,我的幾個ViewControllers對位置數據以及生成的任何錯誤都感興趣。

現在我只是想處理不同的錯誤情況,而我設置的東西的方式是locationManager:didFail:withError:發佈包含錯誤對象的通知。對該通知感興趣的任何ViewController都會向NSNotificationCenter註冊,並相應地處理該錯誤。

我遇到的問題是,所有註冊的ViewController都收到此錯誤通知,即使它們未被當前選定的選項卡加載。雖然我確信這是設計,是否有辦法只發布到活動ViewController?

因爲我的發件人是單身人士,所以我無法通過通知名稱或通知發件人進行區分,因爲它們總是相同。

謝謝!

回答

3

While I'm sure this is by design, is there a way to only post to the active ViewController?

當然 - 最簡單的方法是隻把你addObserverremoveObserver方法爲每個視圖控制器到viewWillAppearviewWillDisappear方法(或didAppear/didDisappear)。

這樣,只有活動可見的視圖控制器纔會收到你的通知(我假設你現在正在將你的addObserver/removeObserver方法放入viewDidLoad/Unload中,因此他們爲什麼在不可見時收到通知,仍然加載)。

+0

啊,就這麼簡單。很好的答案。實際上,我將addObserver放入init中,而實際上我還沒有實現removeObserver,但我想我會按照您的建議去使用willAppear/willDisappear。 – djibouti33 2011-02-13 18:57:17

0

我懷疑最簡單的建議是讓感興趣的視圖控制器在其viewWillAppear方法中添加觀察者,然後在調用viewWillDisappear時刪除觀察者。

1

如果只想當前可見的UIViewController來處理特定的通知,你可以這樣做:

- (void) viewWillAppear:(BOOL)animated 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(handleFooNotification:) 
               name:@"FooNotification" 
               object:nil]; 

} 

- (void) viewWillDisappear:(BOOL)animated 
{ 
    // remove all notifications 
    // 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
}