Модифицировать структуру NSMenu при каждом открытии? - PullRequest
8 голосов
/ 14 марта 2011

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

  1. пользователь запускает сеанс отслеживания в главном меню и выбирает подменю
  2. обнаружение, что подменю собирается открыть и запустить код для его изменения
  3. продолжать отслеживать, пользователь снова отслеживает то же подменю: перейти к 2

Итак, для этого у меня есть объект, реализующий протокол NSMenuDelegate . Метод menuNeedsUpdate работает в первый раз (2), но не работает во второй раз, когда открывается подменю. (Вызывается только один раз за сеанс отслеживания)

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

Не изменять структуру меню или пункты меню во время этого способ.

Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 18 октября 2012

menuWillOpen будет вызываться только один раз, при первом отслеживании подменю.В этот момент вы заполняете меню.

После этого menuWillOpen больше не будет вызываться.Тем не менее, любые изменения в меню будут происходить вживую.Поэтому, когда главное родительское меню открыто, всякий раз, когда исходные данные изменяются (или периодически, если вы не можете обнаружить изменения), обновляйте меню с помощью обычного API NSMenu.

Убедитесь, что любой метод, который вы используете для обновленияменю будет работать, пока система отслеживает ваше меню.

0 голосов
/ 17 марта 2011

Вы можете создать подкласс NSMenu и переопределить submenuAction: .

Или вы можете просто подписаться на NSMenuWillSendActionNotification .

И хотя это не похоже на то, что он будет работать для вас, просто для справки, NSMenuValidation - хорошее место для обновления пунктов меню для каждого элемента в отдельности.

...