В чем разница между «значениями содержимого» и «объектами содержимого» - PullRequest
19 голосов
/ 29 октября 2011

Я сейчас изучаю привязки и у меня есть NSPopUpButton -

В разделе «Выбор значений» представлен ряд параметров привязок - Content, Content Objects, Content Value с, а затем Selected Object, Selected Value, и Selected Tag. Может кто-нибудь объяснить, пожалуйста, разницу между ними?

Ответы [ 2 ]

35 голосов
/ 29 октября 2011

Это объясняется в справке по связыванию какао для NSPopUpButton , хотя эта справка не совсем ясна.

Content - контроллер массива, который предоставляет элементы для всплывающей кнопки. Контроллер массива должен быть связан с массивом. Чтобы определить, как каждый элемент в массиве отображается во всплывающей кнопке, -description отправляется каждому объекту в массиве.

Вы можете настроить это двумя способами:

  • Если вы хотите, чтобы привязка Selected Object предоставляла объект, отличный от элементов массива, управляемых контроллером массива, с которым был связан Content, вы можете связать Content Objects с другим контроллером массива. Это также может быть тот же контроллер массива, но с другим путем ключа;

  • Если вы хотите, чтобы параметры всплывающей кнопки отличались от описания каждого элемента в массиве, управляемого контроллером массива, к которому был привязан Content, вы можете связать Content Values с другим контроллером массива, который управляет массивом, элементы которого содержат параметры всплывающего окна. Это также может быть тот же контроллер массива, но с другим путем ключа.

Простой пример: предположим, у вас есть следующий класс:

@interface Customer : NSObject
@property (copy) NSString *name;
@property (copy) NSString *phoneNumber;
@end

и вы не переопределили метод -description. В этом случае -description бесполезен, а свойство name будет хорошим выбором для всплывающих опций. Вы связываете:

  • Content на контроллер массива, который управляет массивом Customer экземпляров, ключ контроллера arrangedObjects;
  • Content Values к тому же контроллеру массива, ключ контроллера arrangedObjects, путь модели name.

Затем вы можете связать Selected Object с чем-то другим, например со свойством в вашем делегате приложения или контроллере окна. Привязки какао будут назначать выбранный экземпляр Customer этому свойству.

Теперь предположим, что вас интересует не весь выбранный объект Customer, а только его номер телефона. В этом случае вы можете связать Content Objects с одним и тем же контроллером массива, ключом контроллера arrangedObjects, ключом модели phoneNumber. Когда выбрана опция всплывающего окна, привязки Какао установят phoneNumber вместо всего экземпляра Customer. В итоге: если вы не привязываете Content Objects, Selected Object представляет исходный объект в массиве. Если вы связываете Content Objects, тогда Selected Object может быть чем-то другим.

Вы бы связали Selected Value, если бы вас не интересовали исходные объекты (или объекты содержимого), но действительные строки, отображаемые во всплывающих параметрах в соответствии с привязками Content Values.

Быстрый рецепт для предоставления данных всплывающей кнопке:

  • Bind Content, если у вас есть объекты (не только строки), которые представляют параметры всплывающего окна;
  • Bind Content Values, если отображаемые пользователю параметры не могут быть получены с помощью Content, отправив -description элементам массива;
  • Bind Content Objects, если вы хотите, чтобы Selected Object возвращал что-то отличное от элементов массива из Content.

Быстрый рецепт получения текущего выделения во всплывающей кнопке:

  • Bind Selected Object, если вы хотите узнать полный объект (из Content или Content Objects), представляющий текущий всплывающий выбор;
  • Bind Selected Value, если вы хотите только строку, выбранную в данный момент во всплывающем окне.

И, наконец, вы бы использовали Selected Tag, если параметры всплывающего окна фактически взяты из меню, чьи элементы имеют набор тегов.

3 голосов
/ 29 октября 2011

#Object относится к любому KVC-совместимому объекту. #ObjectValue относится к ключевому пути, используемому для получения значения из этого объекта.

Итак, для вашей всплывающей привязки ContentObjects будет привязан, скажем, к NSArrayController arrangedObjects. Скажем, это относится к массиву словарей или управляемых объектов. Вы не можете осмысленно представить словарь во всплывающем окне (вы получаете начало вывода description, например, <NSCFDictionary... или аналогичного), так что именно здесь начинается привязка contentValues. Это будет что-то вроде вашего NSArrayController arrangedObjects.name, где name - это ключ из вашего словаря или управляемого объекта.

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

...