0

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

問題は、カスタム レベル インジケーターのテキストが表示されないことです。レベルインジケーターには、ある種の暗いオーバーレイがあります。

ここに画像の説明を入力

なぜこれが起こっているのかわかりません。私の実際のアプリでは、このインジケーターの値は、バックグラウンド スレッドで実行されるネットワーク リクエストを介して定期的に更新されます。そのため、特に関数内のメイン スレッドで UI を更新しupdate()ます。クロージャー内のコードを取り出して、テストするためだけに外に出しましたが、それでも機能しません。問題はtextプロパティの値を割り当てることでありdoubleValue、レベル インジケーターの値は適切に更新されますが、テキストは更新されないことがわかります。私は今ちょっと困惑しています。

どんな助けでも大歓迎です。ここにもデモプロジェクトをアップロードしました。

4

2 に答える 2

0

CustomLevelIndicator のプロパティ doubleValue をオーバーライドします。セッターでは、テキストと textField.stringValue を設定します。

于 2015-11-12T01:09:47.213 に答える