我想知道是否有可能动态创建NSTouchBar
项目。在我的应用程序中,我有一个dataSource协议来填充NSTableViewController
的内容。我想使用这个协议也用相同的选项填充touchBar。
这是我正在使用的协议。
protocol RestaurantsViewControllerDelegate {
func numberOfRestaurants(in restaurantsViewController: RestaurantsViewController) -> Int
func restaurantsViewController(_ restaurantsViewController: RestaurantsViewController, restaurantAtIndex index: Int) -> Restaurant
func restaurantsViewController(_ restaurantsViewController: RestaurantsViewController, didSelectRestaurant restaurant: Restaurant)
}
但是,我发现的唯一代码表明我必须手动创建每个按钮,就像这样。
@available(OSX 10.12.1, *)
extension NSTouchBarItem.Identifier {
static let restaurant = NSTouchBarItem.Identifier("my.custom.identifier")
}
extension RestaurantsViewController: NSTouchBarDelegate {
override func makeTouchBar() -> NSTouchBar? {
let touchBar = NSTouchBar()
touchBar.delegate = self
touchBar.defaultItemIdentifiers = [.restaurant]
return touchBar
}
func touchBar(_ touchBar: NSTouchBar, makeItemForIdentifier identifier: NSTouchBarItem.Identifier) -> NSTouchBarItem? {
switch identifier {
case NSTouchBarItem.Identifier.restaurant:
let item = NSCustomTouchBarItem(identifier: identifier)
item.view = NSButton(title: "This is a restaurant", target: nil, action: nil)
return item
default: return nil
}
}
}
有什么方法可以做我想做的事吗?
NSTouchBarItem.Identifier
可以基于任何字符串,包括基于Restaurant
对象的某些标识符的动态字符串。您可以将defaultItemIdentifiers
设置为动态生成的标识符数组,然后为每个标识符调用touchBar(_:,makeItemForIdentifier:)
(然后您可以动态创建按钮或其他每个标识符)。
另一种选择是使用NSScrubber
。这可能是Touch Bar中的单个项目,但它有一个DataSource,可用于根据您的Restaurant数据源填充它。