アプリケーションを開く機能を改造する。SimpleViewerが導入されてから位置づけが変わったこともあるが、今後の拡張性を考えて少し手を入れる。
従来はプリファレンスで一つ選択しておき、キャプチャ後に実行するというものだった。実行できるのは画像が開けるアプリだけでプルダウンから選べる様になっていた。
これを最大5個までのアプリケーションを登録し、これをキャプチャ直後に自動的に実行するのではなく SimpleViewerからアプリを選んで実行するように改造する。
まずはプリファレンスパネルから取りかかる。5つのアプリケーションを自由に選べるようにした。
Cocoa Bindings を使い Shared User Default Controller とバインドするとユーザデフォルトの値をコーディング無しで表示できる。
"Null Placeholder" の値を設定しておくと、バインド先の変数が nil の時に表示してくれる。
ただパスのままだと分かりづらいのでアプリケーション名が表示されるように工夫する。
バインディングした値を表示用に加工するには NSFormatter が使える。
(参考)NSFormatter ※過去の検証ブログ
まず NSFormatter から派生したカスタムフォーマッタクラスを作る。
ApplicationNameFormatter.h
@interface ApplicationNameFormatter : NSFormatter {
}
ApplicationNameFormatter.m
@implementation ApplicationNameFormatter
- (NSString *)stringForObjectValue:(id)anObject
{
NSString* name;
LSCopyDisplayNameForURL((CFURLRef)[NSURL fileURLWithPath:anObject], (CFStringRef *)&name);
if (!name) {
name = @"(not found)";
}
return name;
}
- (BOOL)getObjectValue:(id *)anObject forString:(NSString *)string errorDescription:(NSString **)error
{
return NO;
}
@end
渡されたパスを元に LSCopyDisplayNameForURL( ) でアプリ名を取得して戻す。
クラスを定義したら InterfaceBuilderでインスタンスとして登録し、目的のラベルの fomatter に接続してやる。
実行するとこうなる。
登録は「Choose...」が押されたらダイアログを開きアプリケーションを選択させ、その結果をユーザでフォルトへ保存する。
- - - -
ゆくゆくはブログへのアップローダを用意してキャプチャ後にそれをキックしてアップできると便利だと思う。アプリを登録してキックする簡易的な仕組みを用意しておけば、ユーザ自身が工夫次第で色々できると思う。