ページ

2009年5月22日金曜日

フォントを変更する(3) NSFontPanelの変更を受け取る

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

NSFontManagerのdelegateには #changeFont: というメソッドがあって、NSFontPanelでフォントを変更すると呼び出されるらしい。

Responding to Font Changes

前回も実は AppController.m でこれを受け取るコードを入れておいた。
AppController.m

- (IBAction)showFontPanel:(id)sender
{
:
[[NSFontManager sharedFontManager] setDelegate:self];
:
}
- (void)changeFont: (id) sender
{
NSLog(@"%@", sender);
}


ところがフォント変更しても呼び出されない。
よくよくドキュメントを読むと、このメソッドを起動するメッセージは、レスポンダチェーンに投げられるとのことだった。AppController は単なる NSObject だから、これではメッセージを受け取れないわけだ。そこで少し修正を入れる。

まずレスポンダチェーンに参加させるために AppController を NSWindowController のサブクラスにする。
AppController.h
@interface AppController : NSWindowController {
   :


次に Interface Builder上で NSWindowControllerのアウトレット"window"に、今回のウィンドウを指定する。


最後にコーディング。フォントの「選択する..」が押された時の処理を書く。
AppController.m
- (IBAction)showFontPanel:(id)sender
{
WebPreferences* pref = [_web preferences];
NSFont* font = [NSFont fontWithName:[pref standardFontFamily]
size:13];
[[sender window] makeFirstResponder:[sender window]];

NSFontManager* fm = [NSFontManager sharedFontManager];
[fm setDelegate:self];
[fm orderFrontFontPanel:self];
[fm setSelectedFont:font isMultiple:NO];
}



さて実行してフォントを変えてみる。


(コンソールに)出た。
2009-05-22 21:46:48.085 WebPrefStudy[15993:10b] 
2009-05-22 21:46:58.807 WebPrefStudy[15993:10b]



ポイントはレスポンダチェーンに参加させること。NSWindowControllerのアウトレット"window"をきちんと接続しないとやはりメッセージは飛んでこない。
それとウィンドウをファーストレスポンダーにしないとやはり飛んでこなかった。
 [[sender window] makeFirstResponder:[sender window]];



参考:
Re: NSFontManager changeFont not called