KVO - НаблюдатьValueForKeyPath не вызывается при наблюдении перечисления - PullRequest
8 голосов
/ 11 марта 2011

Я раньше использовал NSNotifications, но впервые пытаюсь использовать KVO в Cocoa Touch.

Мой контроллер 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>

)

Тем не менее, мой метод наблюденийValueForKeyPath в моем viewController никогда не вызывается. Я устанавливаю точку останова, и ничто не достигает ее, даже когда я проверяю, что перечисление изменилось.

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

   [self.tableView reloadData];
}

Я ценю любые мысли о том, что мне не хватает.

1 Ответ

9 голосов
/ 11 марта 2011

Не вижу никаких проблем. Вы уверены, что изменили свойство loadState, вызвав синтезированный метод доступа или используя KVC, или вручную (уведомив об изменениях с помощью willChangeValueForKey: и didChangeValueForKey:)?

...