2015-03-03 45 views
0

系統提供的文本菜單通過發送諸如changeFont:modifyFont:和addFontTrait之類的消息來工作,直到它到達NSTextView爲止。我想擴展它來控制我的NSOutlineView中的行樣式,但我只能夠覆蓋changeFont:在我的窗口控制器中,並截獲消息(也許是一個更好的地方做到這一點,但它現在的作品) 。這適用於更改字體,但其他菜單項(如Bold,Bigger,Smaller)使用modifyFont:和addFontTrait:並不會在窗口控制器中調用,因此我無法修改它們的行爲以在大綱視圖上工作。有趣的是,他們看起來可以在菜單中選擇,但只調用了changeFont:並且據我所知,我需要從方法modifyFont:和addFontTrait:的發件人NSMenuItem中獲取標籤值。可可文本菜單和在NSOutlineView中修改字體

有誰知道如何通過讓其他方法在任何地方被調用來實現這個功能嗎?謝謝!

回答

1

這記錄在Cocoa Text Architecture Guide: Font Handling – Handling Font Changes中。 -addFontTrait:-modifyFont:消息不會發送給響應者鏈。他們直接發送到字體管理器。字體管理器記錄所請求的修改並向響應者鏈發送-changeFont:

您應該只需要執行-changeFont:就可以了。

您沒有從菜單項獲取標籤。字體管理器這樣做。這是字體管理器在內部記錄信息的來源。

你的-changeFont:方法應該在字體管理器上調用-convertFont:,傳遞當前的字體。該方法將返回根據記錄的更改請求修改的新字體。你會爲所有應該受影響的字體做到這一點。 (例如,您可能會選擇其中包含多種字體。)

您通常無法直接訪問請求的修改,例如「添加粗體特徵」或「使字體變大」。

您可以通過子類NSFontManager自定義字體管理器,並在應用程序啓動的早期將您的子類傳遞給+[NSFontManager setFontManagerFactory:]。在您的自定義字體管理器中,您可以單獨跟蹤-addFontTrait:等各種操作消息所請求的更改。這裏是您要檢查sendertag的地方。然後,在大綱視圖中,您可以在驗證它是您的子類的實例之後,查詢您的發件人-changeFont:的屬性,以確定要求進行哪些更改。

但請記住,您的自定義子類將用於整個應用程序,而不僅僅是用於大綱視圖。所以,你的定製應該在除了的正常行爲NSFontManager,而不是而不是,所以它不會破壞東西。

+0

我想實現這個解決方案,看看它是否工作,但我不能設置類使用setFontManagerFactory,因爲一個錯誤「共享的NSFontManager實例已經存在。忽略+ [NSFontManager setFontPanelFactory:] ... 「。這是從applicationWillFinishLaunching調用指定的文檔,但我擔心看似錯誤的錯誤信息,建議我在調用setFontManagerFactory時調用setFontPanelFactory。你能夠在你的代碼中調用這個方法嗎?謝謝! – GenericPtr 2015-03-03 03:55:15

+0

在NSApplicationMain爲我工作之前調用setFontManagerFactory,現在我正在調用那些我想要的方法。我應該能夠弄清楚如何獲得我想要的結果,即使我不得不做一些有點冒險的工作。謝謝! – GenericPtr 2015-03-03 04:01:13

+0

我看到和你一樣的東西。問題在於字體管理器是從MainMenu NIB引用的。必須在任何應用程序委託方法(如'-applicationWillFinishLaunching:')被調用之前加載,因爲應用程序委託在NIB中實例化,並且在那裏也被設置爲委託。你必須在'main()'中執行。 – 2015-03-03 04:01:32