2009-09-12 47 views
5

我試圖使用NSFontPanel來允許用戶更改應用程序範圍的字體設置。它應該是這樣工作的:用戶點擊一個按鈕,彈出一個字體面板,他們選擇一種字體和一個尺寸,並且他們的選擇被保留下來。在可可中使用NSFontPanel

下面的代碼顯示面板:

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

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

文檔似乎表明changeFont:(ID)發送方法應被調用的字體改變時;這不是發生在我的情況。

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

關於我可能做錯什麼的想法?

+0

這個問題讓我: 的http:// stackoverflow.com/questions/6147305/why-isnt-changefont-being-called-from-my-nsfontpanel – 2015-04-18 04:52:44

回答

1

您定義的對象-changeFont:必須是第一響應者或響應者鏈中的第一響應者。您尚未指定您定義方法的位置,但我認爲它位於不在響應器鏈中的控制器對象上。

+0

視圖控制器的視圖實際上被加載到另一個窗口;添加changeFont:到父級的ViewController工作。謝謝你的幫助。 – conmulligan 2009-09-13 13:05:27

1

NSFontManager的代表主要用於通過-fontManager:willIncludeFont:過濾它提供給字體面板的字體。

正如kperryua提到的,-changeFont:被髮送到響應者鏈。啓動字體菜單或其封閉視圖的按鈕可能是放置-changeFont:響應者的好地方。

您可能會發現Font Handling指南稍微比Font Panel指南更有用。

1

的核心問題是這一行:

[fontPanel makeKeyAndOrderFront:sender]; 

通過使字體面板的主要窗口,它有不知道從哪裏發送動作消息像-changeFont:對。

+0

我將它改爲orderFrontFontPanel :;但問題實際上是與響應者鏈有關。謝謝。 – conmulligan 2009-09-13 13:06:43

6

包括此:

[fontManager setTarget:self]; 
0

這是我的工作落實。關鍵的一點是,你應該讓你的對象,你已經實現- (void)changeFont:(id)sender

NSFontManager *fontManager = [NSFontManager sharedFontManager]; 

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

[panel orderFront:self]; 

簡單changeFont第一響應:執行參考 - Font Handling

-(void) changeFont:(id)sender 
{ 
    //Here sender would be NSFontManager 
    NSFont *oldFont = [self font]; 
    NSFont *newFont = [sender convertFont:oldFont]; 
    [self setFont:newFont]; 
}