【问题标题】:NSMenu and NSStatusItem action wont work togetherNSMenu 和 NSStatusItem 动作不能一起工作
【发布时间】:2019-11-26 23:46:47
【问题描述】:

附加到 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

编辑

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

编辑 2

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

编辑 3 个答案

“如果状态项设置了菜单,则单击状态项时不会将操作发送到目标;相反,单击会导致菜单出现。”-appledev NSStatusItem.action

【问题讨论】:

    标签: swift nsstatusitem


    【解决方案1】:

    “如果状态项设置了菜单,则单击状态项时不会将操作发送到目标;相反,单击会导致菜单出现。”-apple dev NSStatusItem.action

    【讨论】:

    • @cheesey 我刚刚完成了这个项目。我认为button.action. 的功能和分配没有问题你的EventMonitor 工作得好吗?或者你能很好地看到图标吗?
    • 嗯,很奇怪,我得到了图标,但我没有得到控制台日志
    • @cheesey 这可能是另一个错误,我已经安装并尝试了几种工作可能性,但我一直在打印。
    • 发现我的 NSMenu 似乎有问题的错误我刚刚尝试删除该代码并进行测试,它确实有效。
    • 所以,错误出现在 constructMenu 函数中,很高兴听到。
    【解决方案2】:

    您可以根据需要为按钮动态分配和显示菜单属性。你需要实现 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:)];
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-01-07
      • 2019-08-17
      • 2016-11-23
      • 2019-02-18
      • 2015-05-16
      • 2017-10-14
      • 2012-06-01
      • 2011-11-05
      • 2018-05-20
      相关资源
      最近更新 更多