6

さて、私はSO全体とGoogle全体をチェックしましたが、コードの何が問題になっているのかわかりません。

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

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

- (void)changeFont:(id)sender
{
    NSFontManager *fontManager = [NSFontManager sharedFontManager];
    font = [fontManager selectedFont];
    NSLog(@"%@",[fontManager selectedFont]);
}

フォントパネルがポップアップしますが、フォントを選択すると、コンソールは(null)フォントマネージャーの選択したフォントに戻ります。誰かが私が欠けているものを知っていますか?

ありがとう

4

1 に答える 1

14

Appleのドキュメントによると、selectedFontinを使用するchangeFont:と予期しない動作が発生する可能性があり、「changeFont内からselectedFontを使用することは強くお勧めしません。」フォントを取得する適切な方法は、現在のフォントを選択したフォントに変換するNSFontPanelように依頼することです。NSFontManager以下を適切に使用するアプリケーションの例を次に示しますNSFontPanel

@interface AppDelegate : NSObject <NSApplicationDelegate>{
    NSFont *font;
}

- (IBAction)selectFont:(id)sender;

@end

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    font = [NSFont boldSystemFontOfSize:12];
}

- (IBAction)selectFont:(id)sender
{
    NSFontManager *fontManager = [NSFontManager sharedFontManager];
    [fontManager setDelegate:self];
    [fontManager setTarget:self];
    [fontManager orderFrontFontPanel:self];
}

- (void)changeFont:(id)sender
{
    font = [sender convertFont:font];
    NSLog(@"%@", font);
}

問題に関係のないコードの一部(IBOutletsからNSButtonsやNSWindowなど)を削除しました。
この例ではARCを使用していることに注意してください。

知っておくべきもう1つの重要なことは、への引数は有効なインスタンスconvertFont:である必要があるということです。NSFontそれ以外の場合は、convertFont:でフォントが選択されていてもnilを返しNSFontPanelます。このため、NSFont *fontインスタンス変数を有効なNSFontインスタンスに初期化することが重要です。

于 2012-11-28T22:40:24.210 に答える