无法以编程方式更新NSTouchBar

时间:2019-03-04 15:41:14

标签: swift macos swift4 macos-mojave nstouchbar

我目前正在开发一个非常简单的Live Scores MAC OSX应用程序供个人使用,在触摸栏中显示一堆标签(分数)。我要通过几个步骤实现的目标:

  1. 每30秒从第三方API获取实时足球比分
  2. 解析分数并将其放入标签
  3. 使用新分数更新触摸栏

[[请注意,此应用不会在任何地方发布,仅供个人使用。我知道Apple严格建议您不要在触摸栏中提供此类内容。]

这是我根据RW(https://www.raywenderlich.com/883-how-to-use-nstouchbar-on-macos)的基本Touch Bar教程编写的代码。我的代码的骨架来自RW教程:

  1. WindowController(StoryBoard入口点)中,像这样覆盖makeTouchBar
override func makeTouchBar() -> NSTouchBar? {
    guard let viewController = contentViewController as? ViewController else {
      return nil
    }
    return viewController.makeTouchBar()
  }
  1. ViewController(也是触摸条代表)中,实现makeTouchBar fn:
override func makeTouchBar() -> NSTouchBar? {
    let touchBar = NSTouchBar()
    touchBar.delegate = self
    touchBar.customizationIdentifier = .scoresBar
    touchBar.defaultItemIdentifiers = [.match1, .flexibleSpace, .match2, ... , .match10]

    return touchBar
  }
    NSTouchBarDelegate中的
  1. ViewControllerscores是我获取的分数存储的位置(请参阅5)。如果尚未获取分数,我将返回nil以获取视图:
extension ViewController: NSTouchBarDelegate {

    func touchBar(_ touchBar: NSTouchBar, makeItemForIdentifier identifier: NSTouchBarItem.Identifier) -> NSTouchBarItem? {

        if (<scores not fetched yet>) {
            return nil
        }
        // matchNum is the match number for which I am showing scores for
        let customViewItem = NSCustomTouchBarItem(identifier: identifier)
        customViewItem.view = NSTextField(labelWithString: self.scores[matchNum ?? 0])
        return customViewItem
    }
}
  1. 要定期获取分数,我需要在ViewController的viewDidLoad()中运行一个计划任务Timer,如下所示:
_ = Timer.scheduledTimer(timeInterval: 30.0, target: self, selector: #selector(ViewController.fetchScores), userInfo: nil, repeats: true)
  1. 最后,这是我的fetchScores函数,它还会调用以更新Touch Bar:
@objc func fetchScores() {
    let url = "<scores api end point>"
    Alamofire.request(url).responseJSON { response in
        if let json = response.result.value {
            // update self.scores here and fill it with latest scores

            if #available(OSX 10.12.2, *) {
                //self.touchBar = nil
                self.touchBar = self.makeTouchBar() // This is where I am calling makeTouchBar again to update Touch Bar content dynamically
            }

        }
    }

根据上面的代码,我的理解是,一旦我在makeTouchBar中调用fetchScores并将其分配给我的视图控制器的touchBar属性,理想情况下,它应该调用touchBar(:makeItemForIdentifier)委托功能来更新触摸栏视图(SO thread on this)。但就我而言,touchBar(:makeItemForIdentifier)从未被调用。第一次调用touchBar(:makeItemForIdentifier)是第一次,是从我的WindowController调用makeTouchBar时(请参见上面的第1点)。而且由于尚未检索到分数,因此我的触摸栏仍然为空。

0 个答案:

没有答案