【问题标题】:Custom NSLevelIndicator doesn't show assigned values自定义 NSLevelIndicator 不显示分配的值
【发布时间】:2015-11-10 17:08:59
【问题描述】:

我创建了一个自定义NSLevelIndicator,它可以在其中显示一个字符串值。下面是它的代码。我在 Storyboard 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)%"
        }
    }
}

问题是自定义级别指示器中的文本不显示。并且水平指示器有某种黑色的覆盖层。

我不知道为什么会这样。在我的实际应用程序中,此指标的值通过在后台线程中执行的网络请求定期更新。这就是我在主线程中更新 UI 的原因,特别是在 update() 函数中。我把代码放在闭包里,放在外面只是为了测试,但它仍然不起作用。请注意,问题在于为text 属性而不是doubleValue 分配值,因为您可以看到级别指示器的值已正确更新,但文本未正确更新。我现在有点难过。

感谢任何帮助。我在这里也有uploaded 一个演示项目。

【问题讨论】:

    标签: swift macos cocoa nstextfield nslevelindicator


    【解决方案1】:

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

    【讨论】:

    • 感谢回复,但没有名为setDoubleValue的方法。我认为那是在Objective-C中。在 Swift 中,它只是一个名为 doubleValue 的属性。
    • 对不起,我还在用 Objective-C。我编辑了我的答案。
    【解决方案2】:

    这里的问题似乎可能是您的代码缺少NSTextFieldIBOutlet。您可以通过添加一个覆盖您的 NSLevelIndicator 并关联它来解决此问题。我没有尝试您的代码,但是,执行以下简单的操作应该可以让您更好地了解该怎么做:

    import Cocoa
    
    class ProgressView: NSView {
    
        @IBOutlet weak var progressIndicator: CustomLevelIndicator!
        @IBOutlet weak var textValue: NSTextField!
    
        func update(value: Double) {
            dispatch_async(dispatch_get_main_queue()) {
                self.progressIndicator.doubleValue = value
                self.textValue.stringValue = "\(value)%"
            }
        }
    }
    

    然后只需在 NSLevelIndicator 顶部添加 NSTextField 并在 IB 中使用 textValue 引用 ProgressView;你应该从那里开始做生意。

    【讨论】:

    • 感谢您的回复。但我没有从界面生成器中添加NSTextField。我正在以编程方式添加它。所以不可能添加IBOutlet
    • 你显然是通过 IB 添加了其他元素,所以不清楚为什么会有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多