2012-04-14 3 views
1

У меня есть пользовательский класс (подкласс NSView - на самом деле, скажем, модифицированный редактор, но не подкласс NSTextView), который я связываться с NSArrayController программно (я определенно не может сделать это с помощью Interface Builder), как это:Какао-привязка программно + обновление значения?

[myEditor bind:@"string" 
    toObject:myController 
    withKeyPath:@"selection.content" 
     options:nil]; 

Вышеуказанные работы, однако при изменении значения, оно не обновляется до моего NSArrayController - это как если бы он не «палка».

Я даже пытался, используя options ниже, но безрезультатно:

NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES],NSContinuouslyUpdatesValueBindingOption, 
         [NSNumber numberWithBool:YES],NSAllowsEditingMultipleValuesSelectionBindingOption, 
         [NSNumber numberWithBool:YES],NSConditionallySetsEditableBindingOption, 
         [NSNumber numberWithBool:YES],NSRaisesForNotApplicableKeysBindingOption, 
         nil]; 

Любые идеи?

+0

Как вы реализовали его в своем пользовательском представлении? – ughoavgfhw

+0

@ughoavgfhw Это взгляд на компонент Scintilla (для какао) - так что это не на заказ. Он включен в официальный выпуск Scintilla. –

ответ

6

Класс должен реализовать поддержку привязок. Классы представления и ячейки, которые поставляются вместе с Cocoa, обычно реализуют определенный набор привязок. Независимо от того, делают ли пользовательские подклассы или нет, разработчик.

Если класс не реализовал определенную поддержку привязки, то запрос -bind:... провалится до реализации NSObject. Однако эта реализация весьма ограничена. Он отслеживает ключевой путь для наблюдаемого контрольного и обновляет через KVC свойство получателя с тем же именем, что и привязка. Но это не идти в другом направлении. То есть, изменения в свойстве на приемнике не передаются наблюдаемому контроллеру через ключ.

Чтобы сделать это менее абстрактным, используя ваш пример. Если класс myEditor специально не реализовал поддержку привязки «строки», то реализация NSObject будет делать [myController addObserver:<some private observer object> forKeyPath:@"selection.content" options:<...> context:<...>].

Когда частный объект наблюдателя получит уведомление об изменении, он сделает [myEditor setValue:[myController valueForKeyPath:@"selection.content"] forKey:@"string"].

Однако, NSObject не будет предпринимать никаких обязательств по наблюдению за «myEditor» или «никогда не звонить» [myController setValue:<...> forKeyPath:@"selection.content"].

Чтобы узнать больше о том, как реализовать поддержку привязки, см. Apple's documentation.

+0

Большое спасибо за ваш ответ! :-) –

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