validateMenuItem не вызывается для каждого пункта меню - PullRequest
1 голос
/ 02 июля 2019

У меня есть главное меню, в котором есть несколько пунктов меню (Файл, Правка, Вид, Окно и т. Д.). Для всех пунктов меню их действие настроено на операцию в FirstResponder.

Приложение имеет одно окно, и это окно имеет тип MyWindow, который наследуется от NSWindow (см. Ниже).

Обратите внимание, что NSWindow реализует NSMenuValidation и, следовательно, он помечается как ошибка, когда MyWindow объявляет о соответствии NSMenuValidation.

Я переопределил функцию validateMenuItem следующим образом:

class MyWindow: NSWindow, NSMenuDelegate {

    ...

    override func validateMenuItem(_ item: NSMenuItem) -> Bool {
        Log.atDebug?.log("\(item.title)")
        ....
    }
}

Когда я запускаю приложение, функция validateMenuItem вызывается для пунктов меню File и Window, но не для пунктов Edit и View.

Примечание. Log - это экземпляр каркаса ведения журналов (SwifterLog).

Действия для всех пунктов меню вызываются правильно. (Также для пунктов меню, для которых validateMenuItem не вызывается)

Мне не сложно обойти эту проблему (функция menuNeedsUpdate вызывается для всех меню и может использоваться для этого), но я хотел бы знать, почему происходит такое поведение.

1 Ответ

0 голосов
/ 02 июля 2019

Это не ответ, но для всех, кто интересуется обходным путем:

@objc func menuNeedsUpdate(_ menu: NSMenu) {

    Log.atDebug?.log("\(menu.title)")

    ...    // do other stuff    

    menu.items.forEach( { $0.isEnabled = validateMenuItem($0) } )
}

Вы должны также установить делегат каждого меню, которое должно быть обработано для объекта MyWindow (в этом примере),В моем примере в меню пункта меню View должен быть установлен делегат MyWindow.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...