Я поддерживаю некоторый устаревший код, и когда он был перенесен для компиляции с SDK 10.8, а не с SDK 10.7, некоторые эквивалентные сочетания клавиш для определенных пунктов меню перестали работать. Моя гипотеза заключается в том, что это связано с тем, что эти пункты меню находятся в отключенном состоянии. NSMenuItems, которые больше не работают, являются частью подменю, в котором для autoenablesItems было установлено значение NO (я подтвердил это в xib через инспектора атрибутов для этого подменю, а также программно, запросив [NSMenu autoenablesItems]. В основном это выглядит что вызов [NSMenuItem setEnabled:] не имеет никакого эффекта, потому что, если я запрашиваю [NSMenuItem isEnabled] сразу после вызова setEnabled:YES, состояние не изменилось, и он по-прежнему возвращает NO для isEnabled, Вот фрагмент кода с выводом он генерирует:
printf("DEBUG: Current state of menu item is ");
[nsMenuItem isEnabled] ? printf("enabled\n") : printf("DISABLED!\n");
printf("DEBUG: Current state of menu autoenablesItems is ");
[nsMenu autoenablesItems] ? printf("YES\n") : printf("NO\n");
[nsMenuItem setEnabled:YES];
printf("DEBUG: Current state of menu after setting it is ");
[nsMenuItem isEnabled] ? printf("enabled\n") : printf("DISABLED!\n");
Вывод:
DEBUG: Current state of menu item is DISABLED!
DEBUG: Current state of menu autoenablesItems is NO
DEBUG: Current state of menu after setting it is DISABLED!
Я также попытался создать подкласс NSMenuItem и переопределить setEnabled, чтобы увидеть, был ли другой вызов setEnabled, который перезаписывал мой вызов, но других вызовов, которые проходят через setEnabled, нет.
Если я нажму на родительское меню подменю, то, похоже, оно исправит состояние, и эти NSMenuItems будут включены, но мой код setEnabled не изменит это состояние. Я попытался добавить наблюдателя к подклассу, включенному, чтобы попытаться поймать, где состояние становится включенным при нажатии на родительское меню, но это также не дало никакого понимания, поскольку наблюдатель срабатывал только для моих вызовов setEnabled, которые на самом деле не меняют состояние.
Из того, что я могу сказать из документации Apple, setEnabled NSMenuItem должен работать, пока для autoenablesItems установлено значение NO в родительском меню, но в данном случае это не работает, и я не могу понять, почему.
В том же коде, если я использую SDK 10.7 для компиляции (предостережение: на самом деле это более старая версия базы кода, поэтому есть и другие отличия, но этот конкретный код тот же), я вижу, что вызов setEnabled изменяет состояние NSMenuItem. Когда он вводит этот код в сборке 10.7, NSMenuItem уже находится во включенном состоянии, но я попытался изменить вызов на setEnabled:NO, чтобы подтвердить, действительно ли это переключало состояние isEnabled, и это произошло, в отличие от сборки 10.8. .
Есть идеи, почему это не работает в 10.8? Я также пробовал с 10.9, и там тоже не получилось. Мне пока не удалось попробовать 10.10 или 10.11, так как есть какой-то другой код, который требует обновления, чтобы его можно было скомпилировать с более новыми SDK (опять же, это довольно старый устаревший код).