2015-11-05 128 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的工具提示似乎是作爲一種特殊情況處理的,所以應用程序不需要專注。

此解決方案將使工具提示應用於菜單項中的所有內容,並出現在菜單旁邊而不是覆蓋它,但看起來這可能不是您的情況中的問題。