Доступ к пункту меню для отключения/включения

Я хотел бы реализовать NSMenuItemдля запуска определенных функций (например, «Выполнить расчет»). Как мне получить доступ к элементам меню, чтобы включать/отключать элементы на основе логики приложения? Например. функция «вырезать» для текста доступна только в качестве пункта меню, когда выбран тест. «Выполнить расчет» следует активировать только при задании определенных критериев. Спасибо!

введите здесь описание изображения


person JFS    schedule 25.02.2019    source источник
comment
NSMenuItem соответствует NSValidatedUserInterfaceItem, который работает с протоколом NSUserInterfaceValidations. Реализовать func validateUserInterfaceItem(_ item: NSValidatedUserInterfaceItem) -> Bool. См. Пользователь Проверка интерфейса.   -  person Willeke    schedule 26.02.2019


Ответы (1)


Вероятно, у вас есть какой-нибудь контроллер представления или оконный контроллер, который реализует runCalculation, например:

class ViewController: NSViewController {

    @IBAction func runCalculation(_ sender: Any?) {
        print(1 + 1)
    }

}

И вы подключили действие пункта меню «Выполнить расчет» к методу runCalculation контроллера.

Чтобы включить и отключить пункт меню, выполните следующие действия:

  1. Убедитесь, что в самом меню «Калькулятор» (типа NSMenu) в IB включено свойство «Автоматическое включение элементов» или что в коде autoenablesItems установлено значение true.

    меню автоматически включает элементы флажка

  2. Сделайте ваш контроллер совместимым с протоколом NSUserInterfaceValidations:

    extension ViewController: NSUserInterfaceValidations {
        func validateUserInterfaceItem(_ item: NSValidatedUserInterfaceItem) -> Bool {
            // See step 3...
            return true
        }
    }
    
  3. В validateUserInterfaceItem проверьте, является ли action элемента runCalculation(_:). Если это так, верните true тогда и только тогда, когда вы хотите разрешить пользователю выполнять вычисления:

    extension ViewController: NSUserInterfaceValidations {
        func validateUserInterfaceItem(_ item: NSValidatedUserInterfaceItem) -> Bool {
            switch item.action {
    
            case #selector(runCalculation(_:))?:
                // Put your real test here.
                return !textField.stringValue.isEmpty
    
            default: return true
            }
        }
    }
    
person rob mayoff    schedule 25.02.2019
comment
Большое спасибо за подробности. Первый раз имею дело с NSMenu. Вы мне очень помогли! - person JFS; 26.02.2019