我正在编写一些简单的Mac应用程序编码,以了解有关各种可可编程主题的更多信息,而添加/删除和编码新菜单项似乎很简单,但是我很难集中精力选择大量预配置菜单项,以及如何正确使用它们。 (仅用于学习经验)。

例如,基于OS X的Mac应用程序,Xcode 7.x中的Cocoa应用程序模板将具有相当完整的菜单。但是,您如何使用它呢? “应用程序”->“关于”菜单项将显示“关于”框,“退出”将退出该应用程序,但是如何使用其他应用程序?

我有一个想法,那就是它与响应者链和当前上下文有关,但是我不确定。

我尝试对文本字段进行试验,发现如果在属性检查器中选择了“允许丰富文本”选项,则可以更改所选文本的字体颜色并使用取消轮廓。可以从应用程序的菜单中激活颜色选择器,而且可以肯定的是,它可以更改文本颜色。但是代码在哪里,又怎么知道我选择了一些文本?其他几个菜单项也可用,但其他菜单项被禁用。例如,我不能选择粗体或斜体。

抱歉,这是一个很长的问题,但是我无法找到有关这些预配置菜单项如何工作的清晰说明。

如果有影响,我正在使用情节提要。

最佳答案

正如您所说,这个问题涉及面很广,对于完整的治疗方法,除了SO答案之外,还需要更多。但是,我将尝试给出一些提示(我不是情节提要方面的专家,但我认为是相同的)。

所有菜单项均相同。当您单击它时,将触发一个动作(带有目标的方法)。您可以在IB的连接检查器窗格中看到。

可以将操作定向到特定的目标(例如viewController)或常规目标(例如“第一响应者”(== nil))。使用后一种方法,消息调用将沿着应用程序跟踪响应者链,直到找到响应的人(或无响应)为止。

您已经注意到,某些菜单选项已经可以使用,例如退出。那是因为它们预先连接了一个动作(退出将terminate:发送到第一响应者)。然后,在项目提供的App支架中的某处实现此方法,例如terminate:由响应者链末尾的NSApplication单例实现。

要使其他菜单选项按照您希望了解其预定义操作的方式工作,例如,“复制”将copy:发送到“第一响应者”。然后在响应者链中的对象中实现该操作方法。为了进行测试,将它们放在接近链尾的App委托中。

如果您需要不同窗口的特定行为,例如“打印”,请在每个窗口控制器中放置一个print:方法。响应者链中的第一个将捕获命令,并且您将获得不同的行为,具体取决于哪个窗口位于顶部。

10-07 13:23
查看更多