我目前正在开发一个非常简单的Live Scores MAC OSX应用程序供个人使用,在触摸栏中显示一堆标签(分数)。我要通过几个步骤实现的目标:
[[请注意,此应用不会在任何地方发布,仅供个人使用。我知道Apple严格建议您不要在触摸栏中提供此类内容。]
这是我根据RW(https://www.raywenderlich.com/883-how-to-use-nstouchbar-on-macos)的基本Touch Bar教程编写的代码。我的代码的骨架来自RW教程:
WindowController
(StoryBoard入口点)中,像这样覆盖makeTouchBar
:override func makeTouchBar() -> NSTouchBar? {
guard let viewController = contentViewController as? ViewController else {
return nil
}
return viewController.makeTouchBar()
}
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
中的ViewController
。 scores
是我获取的分数存储的位置(请参阅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
}
}
viewDidLoad()
中运行一个计划任务Timer,如下所示:_ = Timer.scheduledTimer(timeInterval: 30.0, target: self, selector: #selector(ViewController.fetchScores), userInfo: nil, repeats: true)
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点)。而且由于尚未检索到分数,因此我的触摸栏仍然为空。