3

私は非常に単純な問題を抱えていますが、解決策は非常にとらえどころのないことを証明しています。

これが私が持っているものです:

typedef { foo, bar, baz} EnumType;

@interface SomeObject: NSObject
@property EnumType someEnumValue;
@end

...そして、[object_controllerselection]インスタンスのsomeEnumValueの文字列名を表示するobject_controllerとNSComboBoxを含むビュー。

列挙値の名前に文字列として直接アクセスできないことに気付きました。列挙値の名前を保持するNSArrayを作成し、それにContentValuesプロパティをバインドしようとしました-これにより、コンボボックスにプロパティ文字列が読み込まれますが、選択したインスタンスで列挙値を関連付ける方法が見つかりませんコンボボックスの値に。

また、NSValueTransformerを使用して列挙値をNSStringに、またはその逆に変換しようとしましたが、私の人生では、それを機能させることができません。これらの試みのほとんどは、スローされた例外になります。

このささいな仕事は私の人生から約3時間を吸いました。ヘルプ!ありがとうございました!

4

3 に答える 3

1

あなたの問題を解決するために私が考えることができる2つのアプローチがあります。

  1. 列挙型と同じ順序で文字列を配列にロードします。残りの作業が完了したので、「indexOfSelectedItem」の NSComboBox をクエリすると、列挙型の正確な値が得られます。(注:これは、列挙型がゼロから始まる場合にのみ機能します。例を見ていると、これが当てはまると思います。)

  2. 列挙値を保持するクラスを作成したためです。列挙型の名前を保持するプロパティをもう 1 つ追加します。再び NSComboBox に indexOfSelectedItem をクエリします。コンボボックス。

于 2012-08-13T08:30:38.460 に答える
0

を使用してこれを達成できると思いますNSValueTransformer

次のように列挙型を定義してみてください。

typedef NS_ENUM(NSUInteger, EnumType) {
    foo = 0,
    bar = 1,
    baz = 2
};

次に、値トランスフォーマーで、入力を として扱い、NSNumberを呼び出します-unsignedIntegerValue。必要に応じて列挙型にキャストし、switch ステートメントを実行して、適切な文字列を返します。

バインディングは、列挙値を NSNumber として自動的にラップする必要があります。

于 2013-07-17T05:45:53.857 に答える
0

後世のために私が選んだ解決策を記録する:

最後に、列挙型を使用しないことでこの問題を解決しました。

もちろん問題は、コンボ ボックスがオブジェクトの配列 (つまり、NSObject のインスタンス) にバインドされることを期待しているのに、列挙型が定数の整数 (プリミティブ) として定義されていることです。

列挙型の値をオブジェクトに変換したり、元に戻したりするためのインフラストラクチャを提供できると確信しています。(表向きは、これは NSValueTransformer クラスが行うことであり、サブクラス化して設計するのは簡単です...しかし、私の人生では、実際に NSValueTransformer サブクラスまたはそのインスタンスをコンボにバインドする方法を見つけることができませんでしたボックス.その重要なステップのドキュメントは存在しません.それはかなりクレイジーです.私が見つけたすべての例は、それをバインドする方法ではなく、単にそれをサブクラス化する方法について話しました.そして、私が試したすべてが例外をスローしました.)

最終的に、列挙型の値をクラスのインスタンスにするだけで、この大変な作業と変換をすべて回避できることに気付きました。

したがって、列挙型では、次のすべてを行う必要があります。

typedef { a, b, c } EnumType;
@interface SomeClass {
    @property EnumType enumValue;
}...

// somewhere else, something like this:
NSMutableArray *enumTypeNames = { @"a", @"b", @"c" };

...次に、コンボ ボックスを enumTypeNames にバインドし、いくつかのアクロバットを実行して、enum 値を enumTypeNames インデックスに、またはその逆に変換します。

または、これを行うことができます:

@interface EnumClass {
    @property NSString *name;
} ...
@interface SomeClass {
    @property (weak) EnumClass *enumValue;
} ...

// somewhere else:
NSMutableArray *enumValues = [NSMutableArray new];
[enumValues addObject: [EnumClass initWithName: @"a"]];
[enumValues addObject: [EnumClass initWithName: @"b"]];
[enumValues addObject: [EnumClass initWithName: @"c"]];

...そして、コンボ ボックスを配列に直接バインドします (モデル キー パスとして指定された名前を使用)。はるかにクリーンなソリューション。

于 2012-08-17T15:55:40.917 に答える