Вы можете наблюдать изменения в разных объектах / классах.Я думаю, что проблема в параметре параметров addObserver:forKeyPath:options:context:
.
Существуют различные варианты для типа наблюдения, который вы хотите сделать. KVO Guide является хорошей отправной точкой, но вы, вероятно, захотите NSKeyValueObservingOptionNew
, который я использую в приведенном ниже примере.
Во-первых, «имя» должно быть публичным свойством в ClassB.
Во-вторых, вам, вероятно, не нужно добавлять наблюдателя к «b» в viewWillAppear
в ClassA, потому что вам не нужно добавлять его каждый раз, когда появится представление ClassA.Вам просто нужно добавить наблюдателя один раз, когда вы создаете представление ClassB.После добавления наблюдателя метод observeValueForKeyPath:ofObject:change:context:
будет выполнен в ClassA, поэтому вы можете выполнить обновление интерфейса ClassA оттуда.Вам не нужно ничего делать каждый раз, когда ClassA собирается появиться.
В классе A вам, вероятно, следует создать ClassB непосредственно перед тем, как вы собираетесь поместить ClassB в стек контроллера, предположительно в обработчике событий для какого-либо действия, предпринятого пользователем.Сразу после создания ClassB добавьте наблюдателя в ClassA с правильным значением NSKeyValueObservingOption.
Если вы просто хотите получать уведомления при каждом изменении открытого свойства "name" в ClassB, попробуйте следующее:
ClassB
@interface ClassB : UIViewController {
}
@property (retain) NSString* name;
- (void) aMethodThatModifiesName:(NSString*)newName;
@end
@implementation ClassB
@synthesize name;
- (void) aMethodThatModifiesName:(NSString*)newName {
// do some stuff
self.name = newName;
}
@end
ClassA
@interface ClassA : UIViewController {
}
@property (nonatomic, retain) IBOutlet UILabel* nameLabel;
- (IBAction) someEventHandler:(id)sender;
@end
@implementation ClassA
- (IBAction) someEventHandler:(id)sender {
ClassB* b = [[ClassB alloc]init];
[b addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:NULL];
[self.navigationController pushViewController:b animated:YES];
[b release];
}
- (void) observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context {
if ([keyPath isEqual:@"name"]) {
NSString* changedName = [change objectForKey:NSKeyValueChangeNewKey];
// do something with the changedName - call a method or update the UI here
self.nameLabel.text = changedName;
}
}
@end