Каков наилучший способ добавить составное свойство для привязки к существующему классу - PullRequest
0 голосов
/ 28 мая 2009

Допустим, у меня есть класс Size, который имеет свойства высоты и ширины (на самом деле этот класс немного сложнее, но Size - хороший пример).

Я хочу отобразить это как $ width x $ height в моем пользовательском интерфейсе.

Очевидный способ сделать это - привязать к свойству размеров, которое зависит от ширины и высоты.

Мой вопрос: где лучше всего добавить эту новую недвижимость?

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

Я мог бы добавить его в категорию к классу Size внутри проекта, содержащего представление / контроллер, чтобы он был доступен только в тех местах, которые, как я знаю, будут использоваться, но в разных местах я видел предположения о том, что категории имеют тенденцию быть чрезмерным, и я вынужден задаться вопросом, является ли это одним из тех случаев.

В случае одного экземпляра Size я мог бы создать свойство в классе контроллера, содержащем его, но это становится более сложным, когда у вас есть массив Sizes.

Я мог бы связать объект всего размера и использовать преобразователь, чтобы превратить их в строки, но привязка к массиву размеров привела бы к тому, что вам пришлось бы преобразовывать каждый элемент массива в новый массив в преобразователе, что кажется немного некрасивым.

Ответы [ 3 ]

4 голосов
/ 28 мая 2009

Если вы хотите отобразить это составное значение в виде строки, привяжите «Шаблон отображения 1» текстового поля к свойству width, а «Шаблон отображения 2» (отображается при привязке шаблона отображения 1) к height имущество. В привязке «Шаблон отображения 1» установите для параметра «Шаблон отображения» значение %{value1}@ x %{value2}@ (да, слегка неинтуитивный синтаксис). Это даст текстовое поле, которое отображает «[ширина] x [высота]» и будет обновлять информацию об изменениях в любом из свойств.

Вы можете сделать то же самое с NSTextFieldCell, например, как клетка в NSTableColumn. Недостатком этого метода является то, что текстовое поле не сможет редактировать связанные значения width и height. Вам придется написать NSValueTransformer, если вам нужно будет их редактировать.

1 голос
/ 28 мая 2009

Использование нескольких привязок через шаблон отображения, как предложил Барри, звучит как лучший подход, по крайней мере, не зная больше о вашем пользовательском интерфейсе. Я использовал то же самое в прошлом, когда я построил инспектор для массива изображений и привязал размеры к одному текстовому полю.

Как правило, рекомендуется использовать преобразователи значений или форматеры, если это возможно, но в крайнем случае нет ничего плохого в использовании категории. Я делал это в прошлом, когда у меня были проблемы с привязкой к дате, но я разбил ее на отдельные части времени и даты. Категория - это хороший подход, потому что она позволяет вам поддерживать разделение с моделью, но вам не нужно делать ничего сумасшедшего, например привязку непосредственно к контроллеру.

0 голосов
/ 28 мая 2009

Я хочу отобразить это как $ width x $ height в моем пользовательском интерфейсе.

Почему не два поля? Тогда вы можете сделать их редактируемыми.

(на самом деле класс немного сложнее этого, но Size - хороший пример)

Предполагая, что вышеупомянутое неосуществимо в вашей реальной ситуации, вы можете попробовать создать собственный подкласс NSFormatter и установить его в качестве средства форматирования в ячейке (я предполагаю, что это в табличном представлении, поскольку вы не будете связывать единое управление массивом). Затем вы привязываете к целым объектам Size.

...