2011-03-11 28 views
7

我之前使用過NSNotifications,但這是我第一次嘗試在Cocoa Touch中使用KVO。KVO - observeValueForKeyPath在觀察枚舉時未調用

我的UITableView控制器在各種數據源之間切換,所以我將它們封裝在不同的UITableViewDataSource子類中。我試圖讓我的視圖控制器觀察這些UITableViewDataSource子類中特定的一個,並跟蹤一個名爲loadState的枚舉,該枚舉反映了模型的加載狀態。

我這樣設置觀察:

[self.siteUpdatesDataSource addObserver:self 
          forKeyPath:@"loadState" 
           options:0 
           context:nil]; 

從調試器,我可以看到觀察者註冊:

(gdb) po [self siteUpdatesDataSource] 
<SiteUpdatesTableViewDataSource: 0x651e5a0> 
Current language: auto; currently objective-c 
(gdb) po [[self siteUpdatesDataSource] observationInfo] 
<NSKeyValueObservationInfo 0x651dd70> (
<NSKeyValueObservance 0x651dd10: Observer: 0xc80f1e0, Key path: loadState, Options: <New: NO, Old: NO, Prior: NO> Context: 0x0, Property: 0x651dd90> 

但是,我observeValueForKeyPath方法在我的viewController似乎從未被稱爲。我設置了一個斷點,即使在我確認枚舉已經改變的時候,也沒有任何東西可以達到它。

- (void) observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
          change:(NSDictionary *)change 
         context:(void *)context { 

    [self.tableView reloadData]; 
} 

我很欣賞任何想法,我失蹤。

回答

9

看不到任何問題。你確定你改變loadState財產通過調用合成accessor或通過使用KVC或手動(通知有關更改與willChangeValueForKey:didChangeValueForKey:)

+0

謝謝你做了這個伎倆。我會嘗試嘗試多一點,並找出爲什麼枚舉似乎不會產生變化。我使用合成的setter和getter來獲取枚舉值並通過它們更新self.loadState = kDataReady,例如 – Nick 2011-03-11 21:01:54

+0

等等,你說'做了訣竅',下一行你說'enum doesn' t看起來會產生變化',它是否工作或沒有?我沒有合成枚舉屬性的問題。 – hoha 2011-03-11 22:46:58

+0

對不起,這是行得通的。後來我發現我在一個地方設置了我的枚舉不正確。StackOverflow很不幸在read-只有當我停止回到updaet模式時,即使我的問題是其他問題,也不好意思在這裏,這種方法使我能夠觸發觀察者事件並幫助我追蹤這個問題。 – Nick 2011-03-12 04:08:48