Переопределение меню в Swift с раскадровкой
Я пишу приложение Swift в xCode, и у меня нет проблем с созданием нового элемента меню и его подключением, чтобы отправленное действие реагировало на функцию в моем ViewController. У меня возникают трудности, если я пытаюсь переопределить одно из существующих Apple, предварительно настроенных действий меню. Например, я хотел бы отобразить свою собственную справку, поэтому я хочу переопределить функцию showHelp:, которая в настоящее время является действием, установленным для меню справки.
Это то, что я сделал. Помните, я использую раскадровку, и это работало для новых пунктов меню.
- Выбран инспектор атрибутов для первого ответчика MainMenu.xib
- Добавлено новое действие showMyHelp: и я оставил тип как id
- Создал новую функцию с именем showMyHelp() в моем ViewController
- Выберите пункт меню справки myApplicationName из главного меню, а затем из панели соединений, перетащите его из пункта " Отправленные действия" к первому респонденту MainMenu и выберите showMyHelp из списка выбора. Отправленные действия теперь читают action > First Responder / showMyHelp:
Однако, когда я запускаю приложение, меню справки отключается, и я не могу получить к нему доступ.
Опять же, если я повторю этот метод для одного из моих пользовательских пунктов меню, которые я добавил, он работает нормально. Элемент menu не отключен, и действие выполняется.
1 ответ
ХОРОШО. Я обнаружил, в чем заключалась моя проблема. На шаге 3 выше мне нужно было указать отправителя: AnyObject? в качестве параметра при вызове функции, так showMyHelp(отправитель: AnyObject?)
Теперь все хорошо. Следующим шагом будет выяснить, как управлять включением и отключением пунктов меню по мере необходимости.
Вы также можете реализовать в ViewController.
Но сначала вы указываете флаг для принятия первому респонденту.
import Cocoa
class ViewController: NSViewController {
// ..
override var acceptsFirstResponder: Bool {
return true
}
@IBAction func showHelp(_ sender: Any) {
print("showHelp")
}
Спасибо за ваш полезный пост. Тем не менее, я нашел кое-что, чтобы заставить его работать:
- Подпись функции должна начинаться с
@IBAction
@IBAction func showMyHelp(_ sender: AnyObject?)
- Эта функция должна быть определена в вашем
AppDelegate
,
Для следующего, выполните предыдущие шаги, и это работает!:)