我创建了一个自定义NSLevelIndicator
,可以在其中显示一个字符串值。下面是它的代码。我在故事板 OSX 应用程序中对此进行了测试,效果很好。
import Cocoa
class CustomLevelIndicator: NSLevelIndicator {
var text: String!
private var textField: NSTextField!
override func drawRect(dirtyRect: NSRect) {
super.drawRect(dirtyRect)
}
override func awakeFromNib() {
textField = NSTextField()
textField.stringValue = text
textField.bezeled = false
textField.drawsBackground = false
textField.editable = false
textField.selectable = false
textField.textColor = NSColor.blackColor()
textField.font = NSFont.systemFontOfSize(12)
textField.translatesAutoresizingMaskIntoConstraints = false
addSubview(textField, positioned: .Above, relativeTo: nil)
let xCenterConstraint = NSLayoutConstraint(item: textField, attribute: .CenterX, relatedBy: .Equal, toItem: self, attribute: .CenterX, multiplier: 1, constant: 0)
let yCenterConstraint = NSLayoutConstraint(item: textField, attribute: .CenterY, relatedBy: .Equal, toItem: self, attribute: .CenterY, multiplier: 1, constant: 0)
addConstraints([xCenterConstraint, yCenterConstraint])
}
}
现在我正在尝试在菜单栏应用程序中使用相同的控件。这是它的视图布局。
菜单对象的代码。
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: CustomLevelIndicator!
func update(value: Double) {
dispatch_async(dispatch_get_main_queue()) {
self.progressIndicator.doubleValue = value
self.progressIndicator.text = "\(value)%"
}
}
}
问题是自定义级别指示器中的文本不显示。水平指示器有某种黑色覆盖层。
我无法弄清楚为什么会这样。在我的实际应用程序中,该指标的值通过在后台线程中执行的网络请求定期更新。这就是为什么我专门在update()
函数中更新主线程中的 UI。我把代码放在闭包里,放在外面只是为了测试,但它仍然不起作用。请注意,问题在于为text
属性分配值,而不是doubleValue
您可以看到级别指示器的值已正确更新,但文本未正确更新。我现在有点难过。
任何帮助表示赞赏。我也在这里上传了一个演示项目。