NSMenu和NSStatusItem操作不能一起工作

时间:2018-03-03 20:39:09

标签: swift nsstatusitem

附加到NSStatusItem的按钮不会向其目标选择器发送调用。

我不确定我到底做错了什么。我相信它与button.action一行有关。

let statusItem = NSStatusBar.system.statusItem(withLength:NSStatusItem.squareLength)
let popover = NSPopover()

func applicationDidFinishLaunching(_ aNotification: Notification) {
    if let button = statusItem.button{
        button.image = NSImage(named:NSImage.Name("StatusBar"))
        button.action = #selector(someAction(_:)) //need help here

    }
    popover.contentViewController = QuotesViewController.freshController()
    constructMenu();

}

@objc func someAction(_ sender: Any?){
    print("working");
}

我正在关注本教程 - raywenderlich

修改

这个设置动作的过程适用于我拥有的所有NSMenuItems。我仍然是NSStatusItem的问题。

修改2

显示的代码我认为是正确的,我现在认为还有其他问题。

编辑3回答

  

"如果状态项具有菜单集,则在单击状态项时不会将操作发送到目标;相反,点击会显示菜单。" - appledev NSStatusItem.action

2 个答案:

答案 0 :(得分:0)

  

“如果状态项具有菜单设置,则在单击状态项时不会将操作发送到目标;而是单击会导致菜单显示。” - apple dev NSStatusItem.action

答案 1 :(得分:0)

您可以根据需要动态分配菜单属性并将其显示给按钮。您需要实现NSMenu menuDidClose方法

self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength: NSVariableStatusItemLength];
[self.statusItem.button sendActionOn: (NSLeftMouseUpMask|NSRightMouseUpMask)];
[self.statusItem.button setAction: @selector(statusItemClicked:)];

-(IBAction) statusItemClicked: (id) sender
{
    NSEvent *currentEvent = [NSApp currentEvent];

    // Right click conditions
    if  ((([currentEvent modifierFlags] & NSControlKeyMask) == NSControlKeyMask) ||
        (([currentEvent modifierFlags] & NSCommandKeyMask) == NSCommandKeyMask) ||
        (([currentEvent modifierFlags] & NSRightMouseUpMask) == NSRightMouseUpMask) ||    
        (([currentEvent modifierFlags] & NSRightMouseDownMask) == NSRightMouseDownMask) ||
        ([currentEvent type] == NSRightMouseDown) ||
        ([currentEvent type] == NSRightMouseUp))
    {
        [self showStatusMenu: self];
    }
    else
    {
        // do something besides showing the menu    
    }    
}

-(IBAction) showStatusMenu: (id) sender
{
    self.statusItem.menu = self.statusMenu;
    [self.statusItem.button performClick:nil];
}


-(void) menuDidClose : (NSMenu *) someMenu
{
    if (someMenu == self.statusMenu)
    {
            // re-configure statusitem
            self.statusItem.menu = nil;
            [self.statusItem.button sendActionOn: (NSLeftMouseUpMask|NSRightMouseUpMask)];
            [self.statusItem.button setAction: @selector(statusItemClicked:)];
    }
}