工具提示不会再次显示

时间:2015-11-05 14:20:53

标签: swift macos cocoa tooltip

我有一个专门用于菜单栏的Mac应用程序。它有一个进度条和一个标签。标签显示正在执行的任务的进度百分比。当用户将鼠标指针悬停在进度指示器上时,我想显示更多信息。

enter image description here

当我最初设置工具提示并将鼠标悬停在上面时,它会显示没有问题。

但是,如果我转过某个地方并再次打开菜单应用程序并再次悬停,则工具提示不会出现。我无法弄清楚为什么。这是我的代码。

enter image description here

ProgressMenuController.swift

import Cocoa

class ProgressMenuController: NSObject {

    @IBOutlet weak var menu: NSMenu!
    @IBOutlet weak var progressView: ProgressView!

    let menuItem = NSStatusBar.systemStatusBar().statusItemWithLength(NSVariableStatusItemLength)

    var progressMenuItem: NSMenuItem!

    override func awakeFromNib() {
        menuItem.menu = menu
        menuItem.image = NSImage(named: "icon")

        progressMenuItem = menu.itemWithTitle("Progress")
        progressMenuItem.view = progressView

        progressView.update(42)
    }

    @IBAction func quitClicked(sender: NSMenuItem) {
        NSApplication.sharedApplication().terminate(self)
    }
}

ProgressView.swift

import Cocoa

class ProgressView: NSView {

    @IBOutlet weak var progressIndicator: NSProgressIndicator!
    @IBOutlet weak var progressPercentageLabel: NSTextField!

    func update(value: Double) {
        dispatch_async(dispatch_get_main_queue()) {
            self.progressIndicator.doubleValue = value
            self.progressIndicator.toolTip = "3 out of 5 files has been copied"
            self.progressPercentageLabel.stringValue = "\(value)%"
        }
    }
}

这是一个类似于我的实际应用的演示应用。因此update()函数只被调用一次,并且值是硬编码的。但是在我的实际应用中,会定期跟踪进度,并使用它调用update()函数来更新值。标签的百分比值和进度指示器的值更新没有问题。问题仅在于工具提示。

这是预期的行为,还是我错过了什么?

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,并意识到问题是只有当前关注的窗口会显示工具提示,但在我的应用程序失去焦点后,它永远不会恢复。当用户点击您的窗口时,焦点通常会自动转移,但菜单栏应用程序不会自动转移。使用NSApp.activate,您可以重新关注您的应用:

 override func viewWillAppear() {
    super.viewWillAppear()
    NSApp.activate(ignoringOtherApps: true)
}

答案 1 :(得分:0)

sanche's answer也为我工作,但我最终将工具提示移到我的NSMenuItem,所以我不必从前台应用程序中窃取焦点。 {{1}}的工具提示似乎是作为特殊情况处理的,因此应用程序不需要关注。

此解决方案会使工具提示应用于菜单项中的所有内容,并显示在菜单旁边而不是显示在菜单项旁边,但看起来这可能不是您的问题。