2009-05-28 12 views
0

たとえば、高さと幅のプロパティを持つSizeクラスがあるとします(実際にはクラスはこれより少し複雑ですが、 )。既存のクラスへのバインディングにコンポジットプロパティを追加する最良の方法

これをUIで$ width x $ heightと表示したいとします。

これを行う明白な方法は、幅と高さに依存するdimensionsプロパティにバインドすることです。

この新しいプロパティを追加する場所はどこですか?

私はこれをモーダルのSizeクラス自体に追加することができましたが、別のコントローラが別の文字列を表示したい場合は、もう1つのプロパティを作成することができません。私の場合は、Sizeクラスが複数の場所で使用されるフレームワークにあるため(これはおそらくすべて私が制御できるコードからのものですが)、私はこれをやるのをやめています。

ビュー/コントローラを含むプロジェクトの中のサイズクラスにカテゴリを追加することができますので、使用することがわかっている場所でのみ使用できますが、さまざまな場所で候補を見たことがあります過度に使用される傾向があり、これがこれらのケースの1つであるかどうか疑問視されています。

単一のサイズのインスタンスの場合、それを含むコントローラクラスでプロパティを作成できましたが、サイズの配列を持つと難しくなります。

サイズオブジェクト全体にバインドしてトランスフォーマを使用して文字列に変換できますが、サイズの配列にバインドすると、配列の各要素をトランスフォーマの新しい配列に変換する必要があります。それは少し醜いようです。

答えて

4

この複合値を文字列として表示する場合は、テキストフィールドの「表示パターン1」をwidthプロパティにバインドし、「表示パターン2」(表示パターン1をバインドすると表示されます)をheightプロパティにバインドします。ディスプレイパターン1のバインディングで、 "Display Pattern"を%{value1}@ x %{value2}@に設定します(はい、やや直感的ではありません)。これは "[width] x [height]"と表示されるテキストフィールドを与え、いずれかのプロパティの変更を更新します。

NSTextFieldCellでこれを行うことができます。 NSTableColumnのセルとして。この方法の欠点は、テキストフィールドがバインドされたwidthheightの値を編集できないことです。 NSValueTransformerを編集する必要がある場合は、NSValueTransformerを記述する必要があります。

+0

私は実際にこれらのフィールドを編集可能にする必要はないので理想的です。ありがとう! –

0

これをUIで$ width x $ heightと表示したいとします。

なぜ2つのフィールドはありませんか?その後、それらを編集可能にすることができます。

以上を想定し

はあなたの本当の状況では現実的ではありません(実際にクラスが少し複雑これ以上ですが、サイズが良い例になります)、あなたはカスタムサブクラスを作成してみてくださいNSFormatterの配列をセルのフォーマッタとして設定します(これは、配列に単一のコントロールをバインドしないので、これはテーブルビューにあると仮定します)。次に、Sizeオブジェクト全体にバインドします。

1

Barryがディスプレイのパターンを介して複数のバインディングを使用することは、少なくともあなたのUIについて詳しく知ることなく、最良のアプローチのようなサウンドを提案しました。私は過去に同じことを使用しました。ここでは、一連のイメージのインスペクタを作成し、サイズを単一のテキストフィールドにバインドしました。

可能であれば、値の変圧器やフォーマッタを使用することをお勧めしますが、最後の手段ではカテゴリの使用に問題はありません。私はこれまで、日付にバインドするのに問題があったときにこれをやっていましたが、それを個々の時間と日付に分解しました。カテゴリは、モデルとの分離を維持できるため、コントローラに直接バインドするような狂気のような操作を行う必要がないため、優れたアプローチです。

+0

洞察に感謝します。 –

関連する問題