2015-11-05 127 views
2

我有一个专门居住在菜单栏上的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()函数来更新值。标签的百分比值和进度指示器的值得到更新,没有问题。这个问题只与工具提示有关。

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

回答

1

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

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

sanche's answer工作对我好,但我结束了移动工具提示我NSMenuItem!而非这样我就不必从偷焦点前台应用程序。 NSMenuItem的工具提示似乎是作为一种特殊情况处理的,所以应用程序不需要专注。

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