【问题标题】:NSStatusItem shows only up if it is defined outside of my methodNSStatusItem 只有在我的方法之外定义时才会显示
【发布时间】:2014-05-01 17:49:50
【问题描述】:

我是 Mac OSX 开发的新手。我想建立一个允许输入文本的全局菜单项,按回车键后,它应该跳转到网页。没什么特别的。

让我困惑的是我的简单代码的以下部分:

我在AppDelegate.m(void)applicationDidFinishLaunching:(NSNotification *)aNotification 方法中创建了我的全局菜单项及其 NSMenu 下拉菜单。

如果我说NSStatusItem 是一个privat 局部方法变量,那么在运行应用程序后,状态项将不会显示在全局菜单栏中。

如果我将变量声明为全局私有类(在方法上方),则图标会如愿显示。

感谢您的帮助。

完整的源代码:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Use a NSMenu as dropdown component
    NSMenu* dropdown = [NSMenu new];

    // Disable auto enabled items
    [dropdown setAutoenablesItems:NO];

    // Add custom view menu item

    // 1. Add a empty item to menu
    NSMenuItem* item = [NSMenuItem new];
    [dropdown addItem: item];

    // 2. Create a new custom view with a placeholder rectangle
    NSView* view = [[NSView new] initWithFrame: NSMakeRect(0,0,200,20)];
    item.view = view;

    // 3. Add a text field to the custom view
    NSTextField* textField = [[NSTextField alloc] initWithFrame: NSMakeRect(5,0,190,20)];
    [view addSubview: textField];

    // Add seperator
    [dropdown addItem:[NSMenuItem separatorItem]];

    // Add quit button
    NSMenuItem* menuItem = [dropdown addItemWithTitle:@"Quit"
                                               action:@selector(terminate:)
                                        keyEquivalent:@"q"];

    // Add cmd-key as required keyboardshortcut starting point
    [menuItem setKeyEquivalentModifierMask:NSCommandKeyMask];

    // Get a statusbar item
    NSStatusItem* statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];

    // Set icon
    [statusItem setImage:[NSImage imageNamed:@"icon.png"]];

    // Set tooltip
    [statusItem setToolTip:@"Jump to an issue."];

    // Enable highlighting on click.
    // If left mouse button is pressed, paint the background blue.
    // Default behabior for status item according zo UI guidlines is YES,
    // but the default value of a status item would be NO.
    [statusItem setHighlightMode:YES];

    // Set the dropdown as visible menu
    [statusItem setMenu:dropdown];
}

【问题讨论】:

  • 这是由于 ARC。在 ARC 中,对象在超出范围时被释放。当您将其声明为实例变量时,其范围是直到该实例被释放。但在方法内部,它的范围仅限于该方法。

标签: objective-c macos nsstatusitem


【解决方案1】:

因为如果您只在方法内声明对象并且不在其他地方保留对它的引用,那么它将被限定为该方法。当方法完成执行时,您的对象将被释放并消失。 如果您希望它在应用程序运行时一直存在,您可能希望将其分配给应用程序委托的属性或与应用程序一样长的另一个对象。

【讨论】:

    猜你喜欢
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2023-03-06
    • 2016-06-05
    相关资源
    最近更新 更多