Swift 工具提示没有';我不会再出现了
我有一个只在菜单栏上运行的Mac应用程序。它有一个进度条和一个标签。标签显示正在执行的任务的进度百分比。我想在用户将鼠标指针悬停在进度指示器上时显示更多信息 当我最初设置工具提示并将鼠标悬停在上方时,它将显示为无问题 但是如果我去某个地方,再次打开菜单应用程序并再次悬停,工具提示就不会出现。我不明白为什么。这是我的密码 ProgressMenuController.swiftSwift 工具提示没有';我不会再出现了,swift,macos,cocoa,tooltip,Swift,Macos,Cocoa,Tooltip,我有一个只在菜单栏上运行的Mac应用程序。它有一个进度条和一个标签。标签显示正在执行的任务的进度百分比。我想在用户将鼠标指针悬停在进度指示器上时显示更多信息 当我最初设置工具提示并将鼠标悬停在上方时,它将显示为无问题 但是如果我去某个地方,再次打开菜单应用程序并再次悬停,工具提示就不会出现。我不明白为什么。这是我的密码 ProgressMenuController.swift import Cocoa class ProgressMenuController: NSObject {
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)
}
}
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)%"
}
}
}
ProgressView.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)
}
}
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()
函数来更新值。标签的百分比值和进度指示器的值更新时不会出现问题。问题只存在于工具提示中
这是预期的行为还是我遗漏了什么?我遇到了同样的问题,并意识到问题是只有当前聚焦的窗口才会显示工具提示,但在我的应用程序失去焦点后,它将永远无法恢复。当用户点击你的窗口时,焦点通常会自动转移,但对于菜单栏应用程序来说,焦点并不是自动转移的。使用NSApp.activate,您可以重新关注您的应用程序:
override func viewWillAppear() {
super.viewWillAppear()
NSApp.activate(ignoringOtherApps: true)
}
对我来说也是如此,但我最终将工具提示移动到了我的NSMenuItem
s,这样我就不必从前台应用程序中窃取焦点NSMenuItem
的工具提示似乎是作为特例处理的,因此应用程序不需要关注
此解决方案将使工具提示应用于菜单项中的所有内容,并显示在菜单旁边,而不是菜单上方,但在您的情况下,这似乎不是问题