Перезагрузка/обновление NStoolbar

В моем проекте у меня есть NSToolBar, у которого 5 NSToolBarItems. Я хочу удалить последние два элемента панели инструментов, в которых один из них NSToolbarSpaceItemIdentifier, и снова перезагрузить панель инструментов.

Как это сделать? Я застрял в этой точке для тишины долгое время. Если я хочу удалить элементы из NSToolBar, я получаю предупреждение об ограничениях из-за NSToolbarSpaceItemIdentifier.

Я хочу еще раз вызвать метод делегата и передать ему последний массив элементов.

Как это сделать?
Пожалуйста, помогите.


person Juno    schedule 29.01.2014    source источник


Ответы (2)


Предупреждение об ограничениях кажется отдельной проблемой. Мы видели эту ошибку в версии 10.8, но не в версии 10.9 для одного и того же проекта.
Насколько я могу судить, это ошибка фреймворка и не связана с каким-либо неправильным использованием API.

Что касается удаления элементов панели инструментов:
removeItemAtIndex: — это то, что вам нужно.

Как обычно, документы — ваш друг. В этом случае прочитайте здесь
Темы программирования панели инструментов для Cocoa

person Jay    schedule 13.09.2014

Я не мог найти способ обновить. Однако Джей прав, и его совет можно использовать для быстрого сброса меню.

//Factory Method for reseting toolbar
func setCurrentToolBarItems(desiredItems:[String]){
    // remove all toolbar items
    for _ in (window?.toolbar?.items)!{
        window?.toolbar?.removeItem(at: 0)
    }
    // add new items
    for item in desiredItems{
        window?.toolbar?.insertItem(withItemIdentifier: item, at: 0)
    }
}

Вот дополнительный код для программного создания кнопок.

import Cocoa


class ToolbarWindowController: NSWindowController, NSToolbarDelegate {

    @IBOutlet var DualToolBar: NSToolbar!

    enum ToolbarItemID : String {
        case DeleteCard = "DeleteSelectedCard", RandomizeCards = "RandomizeCards", CardTest = "CardTest",SwitchFirstCardFaceSeen = "SwitchFirstFace", ExitTest = "ExitTest"

        static let allValues = [DeleteCard, RandomizeCards, CardTest, SwitchFirstCardFaceSeen, ExitTest]
    }


    override func windowDidLoad() {
        super.windowDidLoad()

        // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
    }

    func test() {
        contentViewController?.performSegue(withIdentifier: "goToSlideShow", sender: contentViewController)
        setCurrentToolBarItems(desiredItems: [ToolbarItemID.RandomizeCards.rawValue, ToolbarItemID.SwitchFirstCardFaceSeen.rawValue])

    }

    //Factory Method for reseting toolbar
    func setCurrentToolBarItems(desiredItems:[String]){
        // remove all toolbar items
        for _ in (window?.toolbar?.items)!{
            window?.toolbar?.removeItem(at: 0)
        }
        // add new items
        for item in desiredItems{
            window?.toolbar?.insertItem(withItemIdentifier: item, at: 0)
        }
    }


    // MARK: - NSToolbarDelegate

    func customToolbarItem(itemForItemIdentifier itemIdentifier: String, label: String, paletteLabel: String, toolTip: String, target: AnyObject, itemImage: NSImage, action: Selector?) -> NSToolbarItem? {

        let toolbarItem = NSToolbarItem(itemIdentifier: itemIdentifier)
        toolbarItem.label = label
        toolbarItem.paletteLabel = paletteLabel
        toolbarItem.toolTip = toolTip
        toolbarItem.target = target
        toolbarItem.action = action
        toolbarItem.image = itemImage
        return toolbarItem
    }


    /*
     NSToolbar delegates require this function.
     It takes an identifier, and returns the matching NSToolbarItem. It also takes a parameter telling
     whether this toolbar item is going into an actual toolbar, or whether it's going to be displayed
     in a customization palette.
     */
    func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: String, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {

        var toolbarItem: NSToolbarItem = NSToolbarItem()

        /* We create a new NSToolbarItem, and then go through the process of setting up its attributes from the master toolbar item matching that identifier in our dictionary of items.
         */

        switch itemIdentifier {
        case ToolbarItemID.CardTest.rawValue:
            let image = NSImage(named: "NSSlideshowTemplate")!
            toolbarItem = customToolbarItem(itemForItemIdentifier: ToolbarItemID.CardTest.rawValue, label: "test", paletteLabel: "test", toolTip: "test yourself with this cardset", target: self, itemImage: image, action: #selector(self.test))!
        case ToolbarItemID.RandomizeCards.rawValue:
            let image = NSImage(named: "Randomize Button")
            toolbarItem = customToolbarItem(itemForItemIdentifier: ToolbarItemID.RandomizeCards.rawValue, label: "randomize", paletteLabel: "randomize", toolTip: "randomize cards so that you are not always tested with the cards in the same order", target: self, itemImage: image!, action: nil)!
        case ToolbarItemID.DeleteCard.rawValue:
            let image = NSImage(named: "deleteButton")
            toolbarItem = customToolbarItem(itemForItemIdentifier: ToolbarItemID.DeleteCard.rawValue, label: "delete", paletteLabel: "delete", toolTip: "delete card on current selected row", target: self, itemImage: image!, action: nil)!
        case ToolbarItemID.SwitchFirstCardFaceSeen.rawValue:
            let image = NSImage(named: "Switch")
            toolbarItem = customToolbarItem(itemForItemIdentifier: ToolbarItemID.SwitchFirstCardFaceSeen.rawValue, label: "switch def/term", paletteLabel: "switch def/term", toolTip: "Allows users to test themselves using either the definition or the term first", target: self, itemImage: image!, action: nil)!
        case ToolbarItemID.ExitTest.rawValue:
            let image = NSImage(named: "Return to editing 2")
            toolbarItem = customToolbarItem(itemForItemIdentifier: ToolbarItemID.ExitTest.rawValue, label: "editor window", paletteLabel: "editor window", toolTip: "Used to exit testing and reenter editing mode", target: self, itemImage: image!, action: nil)!

        default:

            Swift.print("more buttons must be added")
        }


        return toolbarItem
    }

    /*
     NSToolbar delegates require this function.  It returns an array holding identifiers for the default
     set of toolbar items.  It can also be called by the customization palette to display the default toolbar.
     */

    func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [String] {
        if contentViewController is CardViewer{
            return [ToolbarItemID.CardTest.rawValue]
        }else{
            return [ToolbarItemID.RandomizeCards.rawValue]
        }

        /*  Note:
         That since our toolbar is defined from Interface Builder, an additional separator and customize
         toolbar items will be automatically added to the "default" list of items.
         */
    }

Я думаю, что эта ссылка является наиболее полной для темы панелей инструментов. Я нашел пример кода особенно полезным. "темы программирования панели инструментов для какао": https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Toolbars/Toolbars.html

person jiminybob99    schedule 05.12.2016