質問

NSFontPanelを使用して、ユーザーがアプリケーション全体のフォント設定を変更できるようにしています。ユーザーはボタンをクリックし、フォントパネルがポップアップし、フォントとサイズを選択し、選択が保持されます。

次のコードはパネルを示しています。

- (IBAction)showFontMenu:(id)sender {
    NSFontManager *fontManager = [NSFontManager sharedFontManager];
    [fontManager setDelegate:self];

    NSFontPanel *fontPanel = [fontManager fontPanel:YES];
    [fontPanel makeKeyAndOrderFront:sender];
}

ドキュメントでは、フォントが変更されたときにchangeFont:(id)senderメソッドを呼び出すように提案されているようです。私の場合、これは起きていません。

- (void)changeFont:(id)sender {
    // blah
}

私が間違っている可能性があることについてのアイデアはありますか?

役に立ちましたか?

解決

-changeFont:を定義したオブジェクトは、レスポンダーチェーンの最初のレスポンダーまたはその上になければなりません。メソッドを定義した場所を指定していませんが、レスポンダーチェーンにないコントローラーオブジェクト上にあると想定しています。

他のヒント

これを含める:

[fontManager setTarget:self];

NSFontManager のデリゲートは、主に -fontManager:willIncludeFont:を介してフォントパネルに供給するフォントをフィルタリングするために存在します。

kperryuaが述べているように、 -changeFont:がレスポンダーチェーンに送信されます。フォントメニューまたはそれを囲むビューを起動するボタンは、 -changeFont:のレスポンダーを配置するのに適した場所です。

フォント処理ガイドはフォントパネルガイド。

中心的な問題は次の行です:

[fontPanel makeKeyAndOrderFront:sender];

フォントパネルをキーウィンドウにすると、-changeFont:toなどのアクションメッセージの送信先がわかりません。

これは私の実際の実装です。キーポイントは、-(void)changeFont:(id)sender

を実装した最初のレスポンダーとしてオブジェクトを作成することです
NSFontManager *fontManager = [NSFontManager sharedFontManager];

NSFontPanel *panel = [fontManager fontPanel:YES];
[[self window] makeFirstResponder:self];

[panel orderFront:self];

単純なchangeFont:実装リファレンス-フォント処理

-(void) changeFont:(id)sender
{
    //Here sender would be NSFontManager
    NSFont *oldFont = [self font];
    NSFont *newFont = [sender convertFont:oldFont];
    [self setFont:newFont];
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top