Монитор ключевых модификаторов не вызывается во время контекстного меню - PullRequest
0 голосов
/ 23 сентября 2018

Относительно: Методы NSMenuDelegate, не вызываемые для контекстного меню мой делегат для представления не вызывается, когда он становится видимым.

newWindowMenuItem Заголовок, который я хочу динамически переключатьв зависимости от ключевого модификатора.

func menuWillOpen(_ menu: NSMenu) {
    guard newWindowMenuItem.title != "close" else {
        return
    }
    newWindowMenuItem.title = (appDelegate.shiftKeyDown) ? "Tab" : "Window"
    menu.update()
}

func menuDidClose(_ menu: NSMenu) {
    if menu == newWindowMenuItem.menu {
        newWindowMenuItem.title = "closed"
    }
}

func menu(_ menu: NSMenu, willHighlight item: NSMenuItem?) {
    if let currentEvent = NSApp.currentEvent, item == newWindowMenuItem {
        let flags = currentEvent.modifierFlags
        newWindowMenuItem.title = (flags.contains(.command)) ? "Tab" : "Window"
        menu.update()
        Swift.print("title \(newWindowMenuItem.title)")
    }
}

Зарегистрирован в viewDidLoad () как

 NotificationCenter.default.addObserver(
    self,
    selector: #selector(WebViewController.shiftKeyDown(_:)),
    name: NSNotification.Name(rawValue: "shiftKeyDown"),
    object: nil)

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

Я думал вообще пропустить делегат -так как я не читаю подходящий метод для изменения ключевых модификаторов для своих нужд, и вместо этого, чтобы монитор изменений воздействовал на изменения:

internal func shiftKeyDown(_ notification : Notification) {
    let shiftKeyDown : NSNumber = notification.object as! NSNumber
    Swift.print(String(format: "shift %@", shiftKeyDown.boolValue ? "v" : "^"))

    guard webView.menu != nil else {
        return
    }
    newWindowMenuItem.title = shiftKeyDown.boolValue ? "Tab" : "Window"
    newWindowMenuItem.menu?.update()
}

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

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

@ У Майкла была правильная идея;Я ненавижу ключи от контекстных меню, которые привели меня сюда, но простые работы тоже!Элемент здания / альтернатива в контекстном меню

    item = NSMenuItem(title: "Window", action: #selector(appDelegate.newDocument(_:)), keyEquivalent: "")
    item.target = appDelegate
    subOpen.addItem(item)

    item = NSMenuItem(title: "Tab", action: #selector(appDelegate.newDocument(_:)), keyEquivalent: "")
    item.keyEquivalentModifierMask = .shift
    item.target = appDelegate
    item.isAlternate = true
    item.tag = 1
    subOpen.addItem(item)
0 голосов
/ 23 сентября 2018

Вы не правильно зарегистрировали свой обработчик уведомлений.Метод

internal func shiftKeyDown(_ notification : Notification)

не имеет шансов быть вызванным, потому что он не помечен как @objc.Он должен быть написан

@objc internal func shiftKeyDown(_ notification : Notification)

У вас может быть другой метод shiftKeyDown, который действительно вызывается, или ваш регистрационный код не работает вообще.(Или у вас где-то есть аналогичный именованный метод, и у вас где-то есть опечатка.)

(NotificationCenter - это всего лишь причудливое имя Swift для Objective C NSNotificationCenter, которое, в свою очередь, основано на четномболее старый CFNotificationCenter. И вся #selector -функция Swift построена поверх среды выполнения objc, поэтому она работает только с методами objc.)

...