NVKColorToStringTransformer【実践的Macintoshプログラミング解説】

印刷用表示 |テキストサイズ 小 |中 |大 |

CoreData版 Repeating Motif Generator の開発 Repeating Motif Wonderland CoreData 実践的 Macintosh プログラミング解説

HOME > ソースコード公開 > NVKColorToStringTransformer

更新日 2009-05-24

NVKColorToStringTransformer

NVKColorToStringTransformerの紹介

NVKColorToStringTransformerSample.png NVKColorToStringTransformerは、NSColorをNSStringに変換する値変換です。カラーピッカーで選んだ色の名前を表示する事ができます。

 右の図がサンプルプログラムのスクリーンショットです。カラーウェルをクリックするとカラーピッカーが現れますが、そこで色を選ぶと、その右に色の名前が現れます。

 NVKColorToStringTransformerは逆変換に対応しているため、名前から色に変換する事もできます。ポップアップボタンで色の名前を選ぶと、選択色が変わります。

 Mac OS X 10.5.6で動作確認しています。10.3以降で動作すると思いますが、確認はしていません。

ライセンス

 NVKColorToStringTransformerは無保証です。
 NVKColorToStringTransformerはクリエイティブコモンズライセンスのもとで公開します。

Creative Commons License

 原著作者のクレジットとしては以下の文を含めて下されば結構です。

NVKColorToStringTransformerの原著作者:NovemberKou
公開URL:http://www.novemberkou.com/RMWCD/sourceCode/NVKColorToStringTransformer.html

ダウンロード

 NVKColorToStringTransformerのソースコードと関連ファイルをダウンロードするには下記のリンクをクリックして下さい。

LinkIconNVKColorToStringTransformer Ver.1.0

 NVKColorToStringTransformerを含んだサンプルプログラムのソースコードをダウンロードするには下記のリンクをクリックして下さい。

LinkIconNVKColorToStringTransformerサンプルプログラム

使い方

 NVKColorToStringTransformerを使う手順を説明します。

  1. ソースファイルを自分のプロジェクトにコピーする
  2. NVKColorToStringTransformerを登録する
  3. バインディングの設定で、値変換として上記登録名を指定する

1. ソースファイルを自分のプロジェクトにコピーする

 ダウンロードしたファイルを解凍してできたフォルダの中には二つのファイルと二つのフォルダが入っています。全てのファイルをあなたのプロジェクトにコピーして下さい。

 「グループとファイル」の追加したい場所で右クリックして「追加」ー「既存のファイル」を実行します。

addStrings.png

 全てのファイルを選択して「追加」ボタンを押して下さい。コマンドキーを押しながらクリックしていけば複数のファイルを選択できます。

addStrings2.png

2. NVKColorToStringTransformerを登録する

 値変換なので事前に登録する必要があります。登録はアプリケーションが起動するプロセスのできるだけ早い段階がよいのですが、下記リンクの情報によるとアプリケーションのデリゲートとなるオブジェクトのinitializeメソッドで登録するのが普通の様です。

 サンプルプログラムではAppControllerというクラスをアプリケーションのデリゲートとしています。このinitializeメソッドで以下の様に登録しています。

+ (void)initialize
{
    NVKColorToStringTransformer *colorToString;

    colorToString = [[[NVKColorToStringTransformer alloc] init] autorelease];
    [NSValueTransformer setValueTransformer:colorToString
                                    forName:@"NVKColorToString"];
}

3. バインディングの設定で、値変換として上記登録名を指定する

BindingExsample.png あとはバインディングの設定をする時に、値変換として上記の登録名を指定すればOKです。

 サンプルプログラムでは、テキストフィールドのバインディング設定は右の様になっています。

 ただし注意すべき点が一つあります。NSColorクラスのインスタンスにバインドしているのか、それともNSColorをアーカイブしたNSDataクラスのインスタンスにバインドしているのかを意識する必要があるという事です。

 例えばサンプルプログラムではNSColorをアーカイブしたNSDataクラスのインスタンスにバインドしています。NSDataにわざわざ変換しているのは、データをユーザデフォルトに保存しているためです。デフォルトデータベースはNSColorを直接取り扱う事ができないので、NSDataに変換する必要があるのです。

BindingExsample2.png そのような事情があるため、サンプルプログラムのカラーウェルのバインディング設定は右の様になっています。値変換としてNSUnarchiveFromDataを指定する事でNSDataに変換しています。

 同じ事がCoreDataを使う場合でも起こります。NSColorは非標準属性なので、永続化する際にNSDataに変換する必要があるのです。

 以上のような状況を考えて、NVKColorToStringTransformerはNSColorをアーカイブしたNSDataクラスのインスタンスにバインドしている事を想定して、これをデフォルトの動作としています。NSColorクラスのインスタンスにバインドしている場合は、NVKColorToStringTransformerクラスのインスタンスにsetArchive:NOというメッセージを送って下さい。

 例えば以下の様にします。

+ (void)initialize
{
    NVKColorToStringTransformer *colorToString;

    colorToString = [[[NVKColorToStringTransformer alloc] init] autorelease];
    [colorToString setArchive:NO];
    [NSValueTransformer setValueTransformer:colorToString
                                    forName:@"NVKColorToString"];
}

クレヨンカラーリストを優先する

 NVKColorToStringTransformerは有効なカラーリストの色をしらみつぶしにチェックして、色が一致したらその名前を返す動作をしています。複数のカラーリストで色が重複していなければよいのですが、AppleカラーリストとCrayonsカラーリストでは幾つか重複する色が見られます。したがってクレヨンカラーピッカーで「サクランボ」を選んでいるのに、NVKColorToStringTransformerが「レッド」を返してくるという事が起こります。

 クレヨンカラーリストを優先してチェックする場合はNVKColorToStringTransformerクラスのインスタンスにsetCrayonsFirst:YESというメッセージを送ります。優先順位を特に指定しない場合はsetCrayonsFirst:NOというメッセージを送ります。デフォルトではYESになっています。

名前のついた色の名前をタイトルにしたメニューを作る

 NVKColorToStringTransformerのクラスメソッドにmenuFromColorLists:というものがあります。これは引数で指定された名前のカラーリストに含まれる色の名前をタイトルにしたメニューを返すユーティリティメソッドです。

 サンプルプログラムではこのメソッドを使ってポップアップボタンにメニューをセットしています。

- (void)awakeFromNib
{
    NSArray *names = [NSArray arrayWithObjects:@"Apple",@"Crayons",nil];
    [popupButton setMenu:[NVKColorToStringTransformer menuFromColorLists:names]];
    [popupButton bind:@"selectedValue"
             toObject:[NSUserDefaultsController sharedUserDefaultsController]
          withKeyPath:@"values.testColor"
              options:[NSDictionary dictionaryWithObject:@"NVKColorToString"
                                                  forKey:NSValueTransformerNameBindingOption]];
}

 ポップアップボタンのバインディング設定をInterface Builderではなくプログラムで行なっています。これはInterface Builderで設定すると、起動時に必ず最初の項目が選択されてしまう不具合が発生したための対策です。