Пользовательский 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; Вы должны быть в бизнесе оттуда.