Динамические элементы NSTouchBar - PullRequest
0 голосов
/ 30 августа 2018

Мне интересно, возможно ли динамическое создание NSTouchBar предметов. В моем приложении у меня есть протокол источника данных, чтобы заполнить содержимое NSTableViewController. Я хотел бы использовать этот протокол, чтобы также заполнить сенсорную панель теми же параметрами.

Это протокол, который я использую.

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
        }
    }
}

Есть ли способ, которым я хотел бы заняться?

1 Ответ

0 голосов
/ 04 сентября 2018

NSTouchBarItem.Identifier может основываться на любой строке, включая динамические, основанные на некотором идентификаторе объекта Restaurant. Вы можете установить defaultItemIdentifiers для этого массива динамически генерируемых идентификаторов, и затем для каждого из этих идентификаторов будет вызываться touchBar(_:,makeItemForIdentifier:) (который затем можно будет создать кнопкой или другим способом для каждого из этих идентификаторов).

Другой альтернативой является использование NSScrubber. Это может быть отдельный элемент на сенсорной панели, но тогда он имеет источник данных, который можно использовать для его заполнения на основе источника данных ресторана.

...