动态NSTouchBar项目

问题描述 投票:0回答:1

我想知道是否有可能动态创建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
        }
    }
}

有什么方法可以做我想做的事吗?

swift appkit nstouchbar
1个回答
0
投票

NSTouchBarItem.Identifier可以基于任何字符串,包括基于Restaurant对象的某些标识符的动态字符串。您可以将defaultItemIdentifiers设置为动态生成的标识符数组,然后为每个标识符调用touchBar(_:,makeItemForIdentifier:)(然后您可以动态创建按钮或其他每个标识符)。

另一种选择是使用NSScrubber。这可能是Touch Bar中的单个项目,但它有一个DataSource,可用于根据您的Restaurant数据源填充它。

© www.soinside.com 2019 - 2024. All rights reserved.