自定义NSLevelIndicator不显示指定的值

时间:2015-11-10 17:09:00

标签: swift macos cocoa nstextfield nslevelindicator

我创建了一个自定义NSLevelIndicator,可以在其中显示字符串值。下面是它的代码。我在故事板OSX应用程序中对此进行了测试,效果很好。

enter image description here

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])
    }
}

现在我尝试在菜单栏应用中使用相同的控件。这是它的视图布局。

enter image description here

菜单对象的代码。

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)%"
        }
    }
}

问题是自定义级别指示器中的文本没有显示出来。水平指示器有某种暗覆盖。

enter image description here

我无法弄清楚为什么会这样。在我的实际应用程序中,此指标的值会定期通过在后台线程中执行的网络请求进行更新。这就是为什么我在update()函数中专门更新主线程中的UI的原因。我把代码放在封口内,然后将它放在外面进行测试,但它仍然无法正常工作。请注意,问题在于为text属性而不是doubleValue分配值,因为您可以看到级别指示器的值已正确更新,但未正确更新。我现在有点难过了。

感谢任何帮助。我也是uploaded一个演示项目。

2 个答案:

答案 0 :(得分:0)

覆盖CustomLevelIndicator中的属性doubleValue。在setter中设置text和textField.stringValue。

答案 1 :(得分:0)

此处的问题似乎可能是您的代码缺少IBOutlet的{​​{1}}。您可以通过添加一个覆盖NSTextField并关联它的问题来解决问题。我没有尝试过你的代码,但是,做一些简单的事情可以让你更好地了解该怎么做:

NSLevelIndicator

然后只需在NSLevelIndicator上添加NSTextField,并在IB中引用带有textValue的ProgressView;你应该从那里开展业务。