Пользовательский NSLevelIndicator не показывает назначенные значения

Я создал кастом 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() функция. Я взял код внутри замыкания и поместил его снаружи только для проверки, но он все равно не работает. Обратите внимание, что проблема заключается в присвоении значения для text собственность, а не doubleValue как видите, значение индикатора уровня обновляется правильно, но не текст. Я сейчас немного озадачен.

Любая помощь приветствуется. Я также загрузил демо-проект здесь.

2 ответа

Переопределите свойство doubleValue в CustomLevelIndicator. В сеттере вы устанавливаете text и textField.stringValue.

Проблема здесь, кажется, может быть, ваш код не хватает IBOutlet для NSTextField, Вы могли бы, вероятно, решить проблему, добавив один, который перекрывает ваш 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)%"
        }
    }
}

Затем просто добавьте NSTextField поверх NSLevelIndicator и создайте ссылку на ProgressView с textValue в IB; Вы должны быть в бизнесе оттуда.

Другие вопросы по тегам