2012-11-28 89 views
4

好吧,我已經檢查了S.O.和遍佈谷歌和我找不到什麼是錯我的代碼:NSFontManager selectedFont returns null

- (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)。任何人都知道我錯過了什麼?

感謝

回答

13

蘋果Documentation說,使用selectedFontchangeFont:可能會導致意外的行爲和「從內部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。

另一件需要知道的重要事項是convertFont:的參數需要是有效的NSFont實例。否則,即使在NSFontPanel中選擇了字體,convertFont:也將返回零。由於這個原因,將NSFont *font實例變量初始化爲有效的NSFont實例很重要。

+1

呵呵,我不知道爲什麼要轉換我現有的字體變量的作品......但沒關係。非常感謝! – David

+0

一個常見的誤解是NSFontPanel被用來創建一個新的字體對象。從David Chisnall的'Cocoa Programming - Developers Handbook',「字體面板更復雜,它向字體管理器發送更新,這是Cocoa文本系統的核心部分,負責處理與字體轉換的交互。在字體面板中的一個屬性,它不會創建一個新的字體描述,字體面板和NSFontManager跟蹤已經對字體進行的修改,在第21行,我們通過發送convert:message字體管理器「。 –