首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NStoolbar重载/刷新

NStoolbar重载/刷新
EN

Stack Overflow用户
提问于 2014-01-29 18:59:13
回答 2查看 1.9K关注 0票数 6

在我的项目中,我有一个有5个NSToolBarItemsNSToolBar。我想删除最后两个toolbarItems,其中一个是NSToolbarSpaceItemIdentifier,然后再次重新加载工具栏。

该怎么做呢?我在这一点上被困了很长一段时间。如果我想从NSToolBar中删除这些项,由于NSToolbarSpaceItemIdentifier,我会收到约束警告。

我想再次调用委托方法,并将最新的items数组传递给它。

该怎么做呢?

请帮帮忙。

EN

回答 2

Stack Overflow用户

发布于 2016-12-05 11:22:36

我找不到振作精神的方法。然而,Jay是正确的,他的建议可以用来快速重置菜单

代码语言:javascript
复制
//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)
    }
}

下面是一些用于以编程方式创建按钮的附加代码。

代码语言:javascript
复制
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.
         */
    }

我认为这个链接是工具栏主题中最完整的。我发现示例代码特别有用。“cocoa的工具栏编程主题”:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Toolbars/Toolbars.html

票数 3
EN

Stack Overflow用户

发布于 2014-09-13 17:28:17

约束警告似乎是一个单独的问题-我们在10.8版本中看到了这个bug,但在10.9版本中没有看到。

据我所知,这是一个框架错误,与API的任何一种错误使用无关。

就删除工具栏项而言:

removeItemAtIndex:就是你要找的东西。

像往常一样,文档是你的朋友。在这种情况下,请在此处阅读

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21429021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档