続いてアプリケーションのアイコンを表示する。
まずは Interface Builder を使って名称の左側に NSImageView を配置する。
ここへアプリケーションのアイコン画像を当てはめるのだが Cocoa Bindings を使おう。いくつかあるうちの Value を使う。
"Bind to:" でユーザデフォルトへ接続し、"Model Key Path" にはユーザデフォルトのキー(例では Application5)を指定する。ただしユーザデフォルトの値はアプリケーションプログラムのパスなので、このままではアイコン画像は表示できない。そこで Value Transformer を使い、アプリケーションパスをアイコン画像(NSImage)に変換してやる。
Value Transformer は以前検証したことがある。下記を参照の事。
Cocoaの日々 - NSValueTransformer
定義したクラスは次の通り。
ApplicationTransformer.h
@interface ApplicationIconTransformer : NSValueTransformer {
}@end
ApplicationTransformer.m
@implementation ApplicationIconTransformer
+ (Class)transformedValueClass
{
return [NSImage class];
}
- (id)transformedValue:(id)value
{
if (!value) {
return nil;
}
return [[NSWorkspace sharedWorkspace] iconForFile:value];
}
@end
NSWorkspace#iconForFile: を使い、アプリケーションパスからアイコン画像(NSImage)を取り出し、これを変換後の値として返している。たったこれだけでモデルとビューの接続が完了する。
さて実行してみよう。
いい感じだ。
コードらしいコードを書いていないのだが、アプリを選択すると即時にアイコン画像が反映される。
あいかわらず Cocoa Bindingsは楽だ。