後世のために私が選んだ解決策を記録する:
最後に、列挙型を使用しないことでこの問題を解決しました。
もちろん問題は、コンボ ボックスがオブジェクトの配列 (つまり、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"]];
...そして、コンボ ボックスを配列に直接バインドします (モデル キー パスとして指定された名前を使用)。はるかにクリーンなソリューション。