Меню в AppKit полагаются на цепочку ответчиков для доставки действий и динамической проверки пунктов меню.
Каждый NSMenuItem имеет action — селектор, указывающий на метод, который должен обработать событие. Обычно target устанавливается в nil, что говорит AppKit автоматически искать в цепочке ответчиков во время выполнения.
menuItem.action = #selector(handleExport(_:))
menuItem.target = nil
Когда пункт меню нажат, AppKit проходит цепочку ответчиков по порядку:
AppKit отправляет действие первому объекту в этой цепочке, который реализует нужный селектор.
Чтобы динамически включать или отключать пункт меню, реализуй протокол NSMenuItemValidation и напиши метод validateMenuItem(_:):
func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
if menuItem.action == #selector(handleExport(_:)) {
return documentIsReady
}
return true
}
AppKit вызывает этот метод автоматически перед показом меню — на том же объекте, который будет обрабатывать действие.
target в nil, чтобы задействовать автоматический поиск по цепочке ответчиковvalidateMenuItem(_:) для управления доступностью пункта в зависимости от состояния приложенияКогда у NSMenuItem установлен target равный nil, AppKit автоматически во время выполнения ищет в цепочке ответчиков объект, который реализует selector действия.
Новый — ещё не проверен сообществом
Вы