値変換の実装
Appleのドキュメントを見てもいまいち実装の仕方がよくわからなかったんですが、いろいろ徘徊して解決したので、メモっておきます。(ちなみに、CloCalXのホットキー文字列の表示や、iCalの色設定部分などで使用されています)
値変換を独自に実装するために必要なことは次の通りです。
- NSValueTransformerのサブクラスの実装
- 上記クラスのnibへの登録
- 上記クラスのコード上での登録
順番に見ていきましょう。
NSValueTransformerのサブクラスの実装
必要なメソッドを列挙します。
- 値変換後に返される値のクラスを宣言
+(Class) transformedValueClass
+(BOOL) allowReverseTransformation
-(id) transformedValue:(id)value
-(id) reverseTransformedValue:(id)value
上記クラスのnibへの登録
これは特に問題ないと思いますが、bindingしたいオブジェクトに対し、bindingインスペクタにて、登録したい値変換の名前を直接入力します。
上記クラスのコード上での登録
たとえば、MyTransformerというクラスで値変換を実装した場合、
MyTransformer* transformer = [[[MyTransformer alloc] init] autorelease]; [NSValueTransformer setValueTransformer:transformer forName:[MyTransformer className]];
という風に登録します。このsetValueTransformer:forName:で意外にてこずってしまったのが、forName:に対して何を入力すればよいのかよくわからかったからでした。要は、nibへの登録名と同じものであればよいようですが、個人的には間違いのないようにクラス名で統一しています。(なので、わざとclassNameメソッドを使用)
このコードをどこに記述するかについては、Appleによれば、applicationDidFinishLaunching:内でという風になっていますが、実際にはその値変換が実行される前であればいつでもよいようです。その値変換を利用するnibのowerクラスをインスタンス化するときにそのinitの中でやると、各モジュールがきれいに切り分けられるような気がしてます。