itok's Lab

昔の開発ネタを記録として残してます

値変換の実装

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の中でやると、各モジュールがきれいに切り分けられるような気がしてます。