2014-01-29 2 views
3

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

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

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

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

ответ

2

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

Что касается элементов панели инструментов:
removeItemAtIndex: - это то, что вы ищете.

Как обычно, документы - ваш друг. В этом случае, пожалуйста, есть прочитать здесь
Toolbar Programming Topics for Cocoa

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^