デベロッパドキュメントを読むと、NSWorkspaceクラスのNotificationCenterで、NSWorkspaceDidLaunchApplicationNotification、NSWorkspaceDidTerminateApplicationNotificationをObserveすればいいことがわかった。さっそく実装。
NSWorkspace *ws=[NSWorkspace sharedWorkspace]; [[ws notificationCenter] addObserver:self selector:@selector(appLaunched:) name:NSWorkspaceDidLaunchApplicationNotification object:ws]; [[ws notificationCenter] addObserver:self selector:@selector(appTermed:) name:NSWorkspaceDidTerminateApplicationNotification object:ws];Observerの設定はこれでOK。あとは@selectorを書くだけ。
-(void)appLaunched:(NSNotification *)notification{
NSRunningApplication* app=[[notification userInfo] objectForKey:@"NSWorkspaceApplicationKey"];
[self addAppAndButton:app];
}
addAppAndButtonは実際にaddViewをするメソッドで、たいしたことはしていない。-(void)addAppAndButton:(NSRunningApplication *)app{
if([app bundleIdentifier]!=[[NSRunningApplication currentApplication] bundleIdentifier]){
NSRect viewFrame=NSMakeRect(0, 0, 10,10);
SPApp *sp=[[SPApp alloc] initWithRunningApp:app];
MyView *buttonView=[[MyView alloc] initWithFrame:viewFrame runApp:sp];
[view addSubview:buttonView];
[buttonView release];
[sp release];
}
}
自分自身を拾わないために
if([app bundleIdentifier]!=[[NSRunningApplication currentApplication] bundleIdentifier]){
としているが、こんなんでいいのかな。
他のアプリが起動すればaddSubViewすればいいわけだが、終了したらどうするか。こっちのほうが難しいような感じがしたが、
-(void)appTermed:(NSNotification *)notification{
NSRunningApplication* app=[[notification userInfo] objectForKey:@"NSWorkspaceApplicationKey"];
NSArray *views = [view subviews];
for( MyView * a_view in views){
if([[a_view _app] _pid]==[app processIdentifier]){
[a_view removeFromSuperview];
}
}
}
意外とこれだけで大丈夫のようだ。[a_view removeFromSuperview];のあとに「break;」を入れたほうがよりいいかな。deallocがうまくいっているかどうか、調べる方法をみつけなければ(^^;)。本日わかったことはNotificationで通知されるuserInfoからObjectw取り出すやりかた。rubyで言うところのHashと同じ、とは知っていたが、実際に自分でKeyからObjectを指定して、うまくいくかどうかちょっとどきどき。
subViewを削除するのも[a_view removeFromSuperview];だけでいいとは。拍子抜けするほど簡単だ。
もしかしてObjCって、rubyくらいユーザフレンドリなのか?
Cocoaフレームワークに触りだしてから、毎日が異常に充実している。家に帰ってきてiMac起動させるのが待ち遠しくて仕方がない。職場のPCがWindowsマシンでよかった。Macだったら仕事もしないでプログラミングしているところだった。(^^;)
0 件のコメント:
コメントを投稿