2013-02-08 1 views
8

У меня есть два окна: окно A загружается из NIB; и Window B создается программно.bind: toObject: withKeyPath: options: односторонняя привязка?

Оба окна имеют NStextView: атрибутная строка текстового поля в окне A связана с свойством text модели с использованием IB; в то время как атрибутная строка textview в Window B привязана к свойству модели text с использованием метода -[NSObject bind:toObject:withKeyPath:options:].

[textview bind:@"attributedString" toObject:obj withKeyPath:@"text" options:nil]; 

Вот странная вещь: TextView в Window B действительно связан с obj.text, но изменения в TextView никогда не обновляется до obj.text. Но, если бы я вносил изменения в текстовое окно Window A, соответственно обновлялись obj.text и текстовое окно в окне B.

Итак, я думаю, метод -[NSObject bind:toObject:withKeyPath:options:] предназначен только для односторонней привязки. Я не мог найти ясного объяснения в документах Какао. Есть ли у кого-нибудь опыт в этой проблеме? Как реализовать двустороннюю привязку в коде?

ответ

3

Связывание какао по своей сути является двусторонним, но определенные виды поведения (например, непрерывное/живое обновление текстовых полей) требуют определенных опций. В IB вы захотите убедиться, что установлен флажок «Постоянное обновление значения». Чтобы получить эквивалентное поведение программно, вам нужно будет указать options о привязке. Это может выглядеть примерно так:

[textview bind: NSAttributedStringBinding 
     toObject: obj 
    withKeyPath: @"text" 
     options: (@{ 
       NSContinuouslyUpdatesValueBindingOption : @YES })]; 

Стоит отметить, что при настройке привязки программно, это стоит проверить эквивалент связывания в IB и убедившись, что вы передаете все те же настройки в программной привязки. Например, я вижу в IB, что опции «Разрешить редактирование множественных значений», «Условные наборы редактируемых» и «Причины для неприменимых ключей» по умолчанию отмечены для привязки атрибутов NSTextView Attributed String. Это означало бы, наши программные связывания, вероятно действительно выглядеть:

[textview bind: NSAttributedStringBinding 
     toObject: obj 
    withKeyPath: @"text" 
     options: (@{ 
       NSContinuouslyUpdatesValueBindingOption : @YES, 
       NSAllowsEditingMultipleValuesSelectionBindingOption : @YES, 
       NSConditionallySetsEditableBindingOption : @YES, 
       NSRaisesForNotApplicableKeysBindingOption : @YES })]; 
+0

Это все еще не работало для меня. Я нашел ответ (для моего случая) здесь -> http://stackoverflow.com/questions/1169097/can-you-manually-implement-cocoa-bindings –

+0

Я не уверен в релевантности связанного вопроса выше , Связывание, упомянутое здесь, находится между двумя объектами NSControl - не требуется реализация обязательной привязки. – stevesliva

2

Да, обязывать: ToObject: withKeyPath: Варианты: это один из способов и опции не может повлиять на это. Это не то же самое, что вы делаете привязку в .nib-файле. Как обычно, Apple забыла упомянуть о такой простой вещи в своих документах. Самое простое решение здесь - создать обратную привязку в то же время, когда вы создаете форвардную. Это не будет мертвой петлей вашего кода при назначении значения. Вот пример с по умолчанию пользователя:

// two way binding of MyObject.myValue to user defaults 
[NSUserDefaultsController.sharedUserDefaultsController.values bind: @"myValueInDefaults" 
                  toObject: myObject 
                 withKeyPath: @"myValue" 
                  options: @{@"NSContinuouslyUpdatesValue":@YES}]; 

[myObject bind: @"myValue" 
     toObject: NSUserDefaultsController.sharedUserDefaultsController 
    withKeyPath: @"values.myValueInDefaults" 
     options: @{@"NSContinuouslyUpdatesValue":@YES}]; 
+0

Должен ли я использовать два NSValueTransformers, если мне нужно преобразовать одно значение в другое и наоборот, для ключевого NSValueTransformerBindingOption, или этого было бы достаточно? – rraallvv

+0

Поскольку эти привязки не связаны друг с другом, я думаю, вам нужны два NSValueTransformers, по одному для каждой привязки. Но я не использовал NSValueTransformerBindingOption и не могу точно сказать. –

+0

Я вижу, например, от степеней до радианов и наоборот, я думаю, что потребуется два из них, спасибо – rraallvv

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

  • Нет связанных вопросов^_^