Nickkk
Nickkk

Reputation: 2647

NSToolbarItemGroup has no selection and doesn't send action on click

I currently have a toolbar item group with 3 items, but clicking on any of the items doesn't do anything. Also none of the items appear to be highlighted, not even when manually setting NSToolbarItemGroup.selectedIndex. What am I missing? Setting the action property on the individual items rather than the group makes the items clickable, but still none of them appear to be selected.

enter image description here

class ViewController: NSViewController, NSToolbarDelegate {

    let toolbarItemIdentifier = NSToolbarItem.Identifier("group")
    let toolbarItemIdentifierItem1 = NSToolbarItem.Identifier("item1")
    let toolbarItemIdentifierItem2 = NSToolbarItem.Identifier("item2")
    let toolbarItemIdentifierItem3 = NSToolbarItem.Identifier("item3")

    override func viewDidAppear() {
        let toolbar = NSToolbar()
        toolbar.delegate = self
        view.window!.toolbar = toolbar
        view.window!.toolbarStyle = .expanded
    }
    
    func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
        return [.flexibleSpace, toolbarItemIdentifier]
    }
    
    func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
        return [.flexibleSpace, toolbarItemIdentifier, .flexibleSpace]
    }
    
    func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {
        switch itemIdentifier {
        case toolbarItemIdentifier:
            let item1 = NSToolbarItem(itemIdentifier: toolbarItemIdentifierItem1)
            item1.image = NSImage(named: NSImage.addTemplateName)!
            item1.label = "add"
            let item2 = NSToolbarItem(itemIdentifier: toolbarItemIdentifierItem2)
            item2.image = NSImage(named: NSImage.homeTemplateName)!
            item2.label = "home"
            let item3 = NSToolbarItem(itemIdentifier: toolbarItemIdentifierItem3)
            item3.image = NSImage(named: NSImage.pathTemplateName)!
            item3.label = "path"
            let group = NSToolbarItemGroup(itemIdentifier: itemIdentifier)
            group.subitems = [item1, item2, item3]
            group.selectionMode = .selectOne
            group.selectedIndex = 0
            group.target = self
            group.action = #selector(selectItem(_:))
            return group
        default:
            return nil
        }
    }
    
    @objc func selectItem(_ sender: Any) {
        print(0)
    }

}

Upvotes: 0

Views: 88

Answers (1)

Nickkk
Nickkk

Reputation: 2647

I finally figured out that I needed to also implement toolbarSelectableItemIdentifiers(_:) and get rid of NSToolbarItemGroup, adding the individual items instead:

class ViewController: NSViewController, NSToolbarDelegate {

    let toolbarItemIdentifierItem1 = NSToolbarItem.Identifier("item1")
    let toolbarItemIdentifierItem2 = NSToolbarItem.Identifier("item2")
    let toolbarItemIdentifierItem3 = NSToolbarItem.Identifier("item3")

    override func viewDidAppear() {
        let toolbar = NSToolbar()
        toolbar.delegate = self
        toolbar.selectedItemIdentifier = toolbarItemIdentifierItem1
        view.window!.toolbar = toolbar
        view.window!.toolbarStyle = .expanded
    }
    
    func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
        return [.flexibleSpace, toolbarItemIdentifierItem1, toolbarItemIdentifierItem2, toolbarItemIdentifierItem3]
    }
    
    func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
        return [.flexibleSpace, toolbarItemIdentifierItem1, toolbarItemIdentifierItem2, toolbarItemIdentifierItem3, .flexibleSpace]
    }
    
    func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {
        switch itemIdentifier {
        case toolbarItemIdentifierItem1:
            let item1 = NSToolbarItem(itemIdentifier: toolbarItemIdentifierItem1)
            item1.image = NSImage(named: NSImage.addTemplateName)!
            item1.label = "add"
            item1.target = self
            item1.action = #selector(selectItem(_:))
            return item1
        case toolbarItemIdentifierItem2:
            let item2 = NSToolbarItem(itemIdentifier: toolbarItemIdentifierItem2)
            item2.image = NSImage(named: NSImage.homeTemplateName)!
            item2.label = "home"
            item2.target = self
            item2.action = #selector(selectItem(_:))
            return item2
        case toolbarItemIdentifierItem3:
            let item3 = NSToolbarItem(itemIdentifier: toolbarItemIdentifierItem3)
            item3.image = NSImage(named: NSImage.pathTemplateName)!
            item3.label = "path"
            item3.target = self
            item3.action = #selector(selectItem(_:))
            return item3
        default:
            return nil
        }
    }
    
    func toolbarSelectableItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
        return [toolbarItemIdentifierItem1, toolbarItemIdentifierItem2, toolbarItemIdentifierItem3]
    }
    
    @objc func selectItem(_ sender: Any) {
        print(0)
    }

}

Upvotes: 0

Related Questions