添加复合属性以绑定到现有类的最佳方法是什么

时间:2009-05-28 17:21:16

标签: cocoa properties cocoa-bindings

假设我有一个具有高度和宽度属性的Size类(实际上这个类比这个更复杂,但是Size就是一个很好的例子)。

我希望在我的UI中将其显示为$ width x $ height。

显而易见的方法是绑定到一个维度属性,该属性取决于宽度和高度。

我的问题是添加这个新房产的最佳位置在哪里?

我可以在模态中将它添加到Size类本身,但是如果另一个控制器想要显示不同的字符串,那么我就会创建另一个属性。我也有点不愿意这样做,因为在我的情况下,Size类是在一个框架中,将在几个不同的地方使用(虽然可能都来自我控制的代码)。

我可以将它添加到包含视图/控制器的项目内的Size类的类别中,因此它只能在我知道它将被使用的地方使用,但在各个地方我看到了类别倾向的建议过度使用,我不得不怀疑这是否是其中之一。

对于单个Size实例,我可以在包含它的控制器类中创建属性,但是当你有一个Sizes数组时,这会变得更加困难。

我可以绑定到整个size对象并使用转换器将它们转换为字符串,但是绑定到一个大小的数组会导致你必须将数组的每个元素转换为变换器中的一个新数组,看起来有点难看。

3 个答案:

答案 0 :(得分:4)

如果要将此复合值显示为字符串,则将文本字段的“显示模式1”绑定到width属性,将“显示模式2”(显示模式1绑定时显示)绑定到height财产。在显示模式1绑定中,将“显示模式”设置为%{value1}@ x %{value2}@(是的,稍微不直观的语法)。这将给出一个显示“[width] x [height]”的文本字段,并将更新任一属性中的更改。

您可以使用NSTextFieldCell执行相同操作,例如作为NSTableColumn中的单元格。此方法的缺点是文本字段无法编辑绑定的widthheight值。如果您需要编辑NSValueTransformer,则必须编写NSValueTransformer。

答案 1 :(得分:1)

通过显示模式使用多个绑定,因为Barry建议听起来像是最好的方法,至少在不了解您的UI的情况下。我过去曾使用过同样的东西,我为一组图像构建了一个检查器,并将尺寸绑定到一个文本字段。

一般来说,如果可以的话,最好使用价值变换器或格式化器,但在最后的情况下,使用类别没有任何问题。我过去做过这件事,因为我无法绑定日期,但将其分解为个人时间和日期。类别是一种很好的方法,因为它可以让你保持与模型的分离,但你不需要做任何疯狂的事情,比如直接绑定到控制器。

答案 2 :(得分:0)

  

我希望在我的UI中将其显示为$ width x $ height。

为什么不是两个领域?然后你可以让它们可编辑。

  

(实际上这个类比这个复杂一点,但是Size就是一个很好的例子)

假设上述情况在您的实际情况下不可行,您可以尝试创建NSFormatter的自定义子类,并将其设置为单元格上的格式化程序(我假设这是在表视图中,因为您不会绑定单个控件到一个数组)。然后,您将绑定到整个Size对象。