2014-01-10 3 views
1

У меня есть NSView, в котором все элементы управления привязаны к объекту модели с использованием NSObjectController в Interface Builder.Как получить уведомление о любых изменениях привязки к NSObjectController

Это работает правильно. Теперь я хотел бы, чтобы мой NSViewController был уведомлен о любых изменениях в любых этих привязок. Это возможно? Если да, то как?

ответ

0

Я закончил тем, что наблюдал за членом моего модельного класса, используя KVO. Чтобы автоматизировать процесс (чтобы мне не приходилось писать код для этого для каждого члена каждой модели), я сделал это:

static void *myModelObserverContextPointer = &myModelObserverContextPointer; 

- (void)establishObserversForPanelModel:(FTDisclosurePanelModel *)panelModel { 

    // Add observers for all the model's class members. 
    // 
    // The member variables are updated automatically using bindings as the user makes 
    // adjustments to the user interface. By doing this we can therefore be informed 
    // of any changes that the user is making without having to have a target action for 
    // each control. 

    unsigned int count; 
    objc_property_t *props = class_copyPropertyList([panelModel class], &count); 

    for (int i = 0; i < count; ++i){ 
     NSString *propName = [NSString stringWithUTF8String:property_getName(props[i])]; 
     [panelModel addObserver:self forKeyPath:propName options:0 context:&myModelObserverContextPointer]; 
    } 
} 

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

    // Check for insertions/deletions to the model 

    if (context == myModelObserverContextPointer) { 
     if ([_delegate respondsToSelector:@selector(changeMadeToPanelModel:keyPath:)]) { 
      [_delegate changeMadeToPanelModel:object keyPath:keyPath]; 
     } 
    } 
    else 
     [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 

} 
Смежные вопросы