NSToolbar - Элементы, выделенные серым цветом - Mac - PullRequest
0 голосов
/ 16 ноября 2018

Я работаю над окном настроек для Mac OS, и хотя элемент панели инструментов помечен как выбираемый, а метод делегата возвращает идентификатор контроллера для toolbarAllowedItemIdentifiers и toolbarSelectableItemIdentifiers, кнопка остается недоступной для выбора.

Если я включаю его программно (взломать) в viewDidLoad, он сразу же отключается.

Раскадровка:

enter image description here

Соответствующий класс:

class PreferenceWindowController: NSWindowController, NSToolbarDelegate {

  @IBOutlet weak var toolbar: NSToolbar!

  enum Identifier: String, Equatable {
  case General = "General"
  case Network = "Network"
  case Advanced = "Advanced"

    static let allValuesRaw = [General.rawValue, Network.rawValue]//, Advanced.rawValue]
    static let allValues = [General.toolbarId, Network.toolbarId]//, Advanced.toolbarId]

    var toolbarId: NSToolbarItem.Identifier {
      return NSToolbarItem.Identifier(rawValue: self.rawValue)
    }
  }

  override func windowDidLoad() {
    super.windowDidLoad()

    self.toolbar.selectedItemIdentifier = NSToolbarItem.Identifier(rawValue: Identifier.General.rawValue)
    self.window!.contentViewController = NSStoryboard(name: "Preference", bundle: nil).instantiateController(withIdentifier: "GeneralViewController") as! GeneralViewController
  }




  @IBAction func selectedItem(_ sender: NSToolbarItem) {
    switch sender.itemIdentifier.rawValue {
    case Identifier.General.rawValue:
        self.window!.contentViewController = NSStoryboard(name: "Preference", bundle: nil).instantiateController(withIdentifier: "GeneralViewController") as! GeneralViewController
    case Identifier.Network.rawValue:
        self.window!.contentViewController = NSStoryboard(name: "Preference", bundle: nil).instantiateController(withIdentifier: "NetworkViewController") as! WebhooksViewController
    case Identifier.Advanced.rawValue:
        self.window!.contentViewController = NSStoryboard(name: "Preference", bundle: nil).instantiateController(withIdentifier: "AdvancedViewController") as! AdvancedViewController
    default:

        self.window!.contentViewController = NSStoryboard(name: "Preference", bundle: nil).instantiateController(withIdentifier: "GeneralViewController") as! GeneralViewController
    }
  }


  func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
    return Identifier.allValues
  }

  private func toolbarSelectableItemIdentifiers(_ toolbar: NSToolbar) -> [String] {
    return Identifier.allValuesRaw
  }

}

Обновление:

Я отключил автоматическую проверку и изменил все NSToolbarItems класса CustomToolbarItem, но проверка никогда не вызывается. Странно то, что первая кнопка (Общая) работает, а вторая (Сеть) - нет. Я пробовал это в новом проекте с той же проблемой (работает только первый элемент).

    class CustomToolbarItem: NSToolbarItem {

  override func validate() {
    // validate content view
    if
      let control = self.view as? NSControl,
      let action = self.action,
      let validator = NSApp.target(forAction: action, to: self.target, from: self) as AnyObject?
    {
      switch validator {
      case let validator as NSUserInterfaceValidations:
        control.isEnabled = validator.validateUserInterfaceItem(self)
      default:
        control.isEnabled = validator.validateToolbarItem(self)
      }

    } else {
      super.validate()
    }
  }
...