Я работаю над окном настроек для Mac OS, и хотя элемент панели инструментов помечен как выбираемый, а метод делегата возвращает идентификатор контроллера для toolbarAllowedItemIdentifiers и toolbarSelectableItemIdentifiers, кнопка остается недоступной для выбора.
Если я включаю его программно (взломать) в viewDidLoad, он сразу же отключается.
Раскадровка:
Соответствующий класс:
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()
}
}