单文件应用程序 - OSX 状态栏添加饼型进度条

前面有篇文章提到如何开发一个 macOS 状态栏的退出按钮,添加一个饼型进度还是很有需求的,比如 APP 在处理什么事情的时候,可以添加进度状态提示用户

效果如图

单文件应用程序 - OSX 状态栏添加饼型进度条

开发环境: macOS 10.11 + Xcode8 + Swift3.1

  1. 创建一个 macOSCommand Line Tool 应用程序

  2. 代码如下

    main.swiftlink
    import AppKit
    NSApplication.shared()
    class Event:NSObject {
    var statusItem: NSStatusItem?
    var progress:NSProgressIndicator?
    func closeWindow(sender:AnyObject) {
    NSApp.terminate(nil)
    }
    func btnPressed(sender:NSStatusBarButton?) {
    self.incrProgress(1.0)
    }
    func setup() {
    self.statusItem = NSStatusBar.system().statusItem(withLength: NSVariableStatusItemLength)
    //注意一定要设置,否则进度条你只能看到一根线
    self.statusItem?.length = 26
    self.statusItem?.button?.subviews.removeAll()
    //给 NSStatusItem 添加响应时间
    self.statusItem?.target = self
    self.statusItem!.button!.action = #selector(btnPressed(sender:))
    let progressIndicator = NSProgressIndicator(frame: NSMakeRect(4,2,18,18))
    progressIndicator.style = .spinningStyle
    progressIndicator.isIndeterminate = false
    progressIndicator.minValue = 0
    progressIndicator.maxValue = 100
    progressIndicator.doubleValue = 50
    self.progress = progressIndicator
    self.statusItem?.button?.addSubview(progressIndicator)
    }
    func incrProgress(_ step:Double) {
    if var value = self.progress?.doubleValue {
    value += step
    if value >= 100 {
    self.closeWindow(sender: self)
    }
    if value <= 0 {
    value = 0
    }
    self.progress?.doubleValue = value
    }
    }
    }
    let ev = Event()
    ev.setup()
    NSApp.run()