【问题标题】:Swift - Is it possible to build the menu bar item outside AppDelegate class in a MacOS ManuBar App?Swift - 是否可以在 MacOS ManuBar 应用程序中的 AppDelegate 类之外构建菜单栏项?
【发布时间】:2014-11-08 09:07:50
【问题描述】:

我一次做很多事情,这有时会让人不知所措。学习如何构建 mac os(带有菜单栏和设置窗口),同时学习 swift,有时还尝试将 Objective c 教程改编成 swift。

我已关注this tutorial,以帮助我开始使用带有菜单栏的应用程序。我已经让它工作了,但现在我想稍微改进一下。

本示例中的所有菜单设置都在 AppDelegate 类中。由于我的应用程序中有更多内容,一个设置窗口,我还必须在其中玩表格,我想将与菜单相关的内容清理到我称为 MenuLoader 的负责类中。

我将所有与菜单构建相关的代码从 AppDelegate 移至 MenuLoader,并在 AppDelegate 的 applicationDidFinishLaunching 方法上实例化 MenuLoader。

但是,当我运行代码时,应用程序菜单栏项出现的时间似乎是它正在加载的时间,有一些断点我可以清楚地看到对象存在并且具有预期的属性,但随后它就消失了。恐怕我错过了 AppDelegate 用来保持引用的菜单栏关系的一些连接。

所以我的问题是:是否有可能有一个单独的类只处理状态菜单栏而不是在 AppDelegate 上搞得一团糟?如果您认为这可能与我的实现有关,我将在此处发布一些代码,尽管我不确定它是否会产生很大的不同。

【问题讨论】:

    标签: macos swift menu


    【解决方案1】:

    当然可以有一个单独的类。只要您的逻辑相同,将代码移至另一个类不会改变功能。

    如果某些东西消失了,可能是因为您没有持有对该对象的强引用,因此一旦超出范围,它就会被释放。您可能需要:

     class MyClass {
         var:MyObject! // use this to store the reference to your object
    
         ...
     }
    

    如果这没有帮助,请发布您的一些代码。

    【讨论】:

    • 嗯,这很容易,而且完全有道理。 :) 非常感谢你。我只是实例化了新类而没有保留对它的任何引用。你能帮我做点别的吗:当我正在创建一个带有操作的菜单项时:NSMenuItem(title: name, action: Selector("runMyAction:"), keyEquivalent: "") runMyAction 应该在 AppDelegate 类中.我怎样才能让它期望在新类中定义该方法?我宁愿完全删除这个类的菜单逻辑,而不必从 AppDelegate 中的这个操作调用方法到菜单加载器。
    • 这一切都取决于您将NSMenuItem.target 设置为- 将其设置为具有runMyAction: 方法的任何对象。顺便说一句,你不需要说 Selector("runMyAction:"),只需 "runMyAction:" 就可以了。
    • 谢谢您,很抱歉给您带来困扰。 :) 我做到了: var item : NSMenuItem = NSMenuItem(title: name, action: "runSublime:", keyEquivalent: "") item.target = self;但它仍然引用 AppDelegate 之一。
    • 你的代码看起来不错(而且你不需要说“:NSMenuItem”,编译器会弄清楚的。)self是什么...是AppDelegate吗?如果不是,那是什么让你说它引用了 AppDelegate 呢?
    • 好吧,我在错误的地方修改了代码(我仍然在 AppDelegate 中有代码,并且正在编辑那个,我很傻 :)(我仍然需要了解 xcode 和如何显示多个标签,因为回去可能只会把我送到同一个班级)现在一切都按我预期的那样工作! (必须让我的类继承自 NSObject 才不会有 methodSignatureForSelector 错误,但现在它是完美的。:) 非常感谢! :)
    猜你喜欢
    • 2017-05-15
    • 2017-10-05
    • 2022-06-15
    • 2021-09-21
    • 1970-01-01
    • 2020-05-05
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多