Cocoa文本菜单和修改NSOutlineView中的字体



系统提供的文本菜单的工作方式是向第一响应程序链发送大量消息,如changeFont:modifyFont:和addFontTrait:,直到到达NSTextView。

我想将其扩展到我的NSOutlineView中控制行样式,但我只能在窗口控制器中覆盖changeFont:并拦截消息(也许这是一个更好的地方,但目前有效)。这适用于更改字体,但使用modifyFont:和addFontTrait:的其他菜单项,如Bold、Bigger、Small,在窗口控制器中从未被调用,因此我无法修改它们的行为来处理大纲视图。有趣的是,它们在菜单中看起来是可选的,但只调用了changeFont:,据我所知,我需要从NSMenuItem中获得一个标记值,NSMenuItem是方法modifyFont:和addFontTrait:的发送方。

有人知道如何通过在任何地方调用其他方法来实现此功能吗?谢谢

这在《Cocoa文本架构指南:字体处理-处理字体更改》中有介绍。CCD_ 1和CCD_ 2消息不向上发送到响应器链。它们被直接发送到字体管理器。字体管理器记录所请求的修改,并向上发送-changeFont:到响应器链。

您应该只需要按照现有的方式实现-changeFont:

您无法从菜单项中获取标记。字体管理器就是这么做的。这是字体管理器内部记录的信息的来源。

-changeFont:方法应该在字体管理器上调用-convertFont:,传递当前字体。该方法将返回根据记录的更改请求修改的新字体。你会对所有应该受到影响的字体都这样做。(例如,您可能有一个包含多种字体的选择。)

您通常无法直接访问请求的修改,例如"添加粗体特征"或"加大字体"。

您可以通过在应用程序启动的早期将NSFontManager子类化并将子类传递给+[NSFontManager setFontManagerFactory:]来自定义字体管理器。在自定义字体管理器中,您可以单独跟踪各种操作消息(如-addFontTrait:)所请求的更改。在这里您可以检查-addFontTrait:1的tag。然后,在大纲视图中,您可以在验证-changeFont:的发送方是子类的实例后,查询其属性,以确定请求了哪些更改。

不过,请记住,您的自定义子类将在整个应用程序中使用,而不仅仅是用于大纲视图。因此,除了NSFontManager的正常行为之外,您的自定义应该是,而不是而不是,这样它就不会破坏内容。

最新更新