Не может показаться setEnabled: НЕТ на NSMenuItem
Я подклассифицировал NSMenu
и подключил связку NSMenuItem
через Interface Builder. Я тестировал через отладчик, чтобы убедиться, что они действительно инициализируются.
В меню установлено значение "Не включать". Тем не менее, когда я устанавливаю любой из моих NSMenuItem в [myMenuItem setEnabled:NO]
, они по-прежнему включаются. Даже если я вызываю [self update]
из подкласса NSMenu.
Что мне не хватает?
Ответы
Ответ 1
Я решил это с помощью коллеги, поэтому я размещаю его здесь для других, которые испытывают ту же проблему.
Вы должны настроить NSMenu-sublass для автоматического включения элементов (поведение по умолчанию), а затем реализовать этот метод в NSMenu-sublass.
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
return [menuItem isEnabled];
}
Ответ 2
Имел ту же самую проблему, поэтому я решил опубликовать свое решение. NSMenu auto включает NSMenuButtons, поэтому мы должны переопределить это.
В IB:
![You should uncheck "Auto Enables Items"]()
Или программно:
// Disable auto enable
[myMenu setAutoenablesItems:NO];
// Test it
[myMenuButton setEnabled:NO];
[myMenuButton setEnabled:YES];
Ответ 3
Вы можете решить эту проблему без подкласса.
Если вам нужно только стандартное меню + пользовательский NSMenuItem
, который можно отключить в вашем элементе управления, вы можете просто:
1) Добавьте еще одно меню node - просто перетащите и отпустите Пункт меню подменю из библиотеки объектов в свое меню.
2) Добавьте все NSMenuItems, которым вы хотите управлять этим новым меню node.
3) Откройте "Инспектор открытых атрибутов" для вашего нового меню node и отключите опцию "Автообновление элементов":
http://i.imgur.com/YLZKFam.jpg (пожалуйста, см. изображение здесь, я не могу публиковать его прямо сейчас).
4) настройте другие параметры вашего меню и элементов.
Теперь вы можете написать код типа:
@property (weak) IBOutlet NSMenuItem *hidePlateMenuItem;
...
[self.hidePlateMenuItem setEnabled:NO];
и это хорошо работает.
Ответ 4
Добавляя к ответу его значение, если элемент меню находится внутри одного или нескольких подменю, вам нужно только снять флажок "Автоматическое включение элементов" в подменю пункта меню, а не в любом другом родительском меню.
Ответ 5
![введите описание изображения здесь]()
Вы должны снять флажок Авто Включить элементы в ближайшем родительском NSMenu
Ответ 6
Попробуйте позвонить [myMenuItem setEnabled:NO]
из другого места и убедиться, что это произойдет после, в который загружается содержащийся в меню ниб. Возможно, сделайте это правильно в подклассе NSMenu awakeFromNib
.
Ответ 7
Я пробовал все эти решения, но, наконец, я нашел настоящую проблему, которая также имеет для меня больше смысла.
Это также самый простой способ обращения с отключенным nsmenuitem, который не требует подкласса или кода.
Nsmenuitem прежде, чем быть ребенком самого меню, является дочерним по отношению к основному элементу, например, "Сохранить как..." является дочерним элементом "Файл". Просто выберите родительский элемент (в этом примере - "Файл" ) и запустите "пункты меню автоматического включения" в панели меню "Искритель", и здесь вы идете!
Ответ 8
Свифт 3:
У меня есть элемент подменю в стандартном меню "Вид" под названием "Включить настройку системы при запуске". Я использую функцию ниже, чтобы включить или отключить пункт меню. Примечание: в меню просмотра необходимо отключить "Автообновляемые элементы" в IB.
func enableSystemSetupMenuItem(enabled:Bool) {
//set view menu item to enabled: value
//requires "Auto Enable Items" of "View" menu item to be turned off in IB
//because "View" menu is now turned off for "Auto Enable" we have to handle all
//of the "View" menu items ourselves
//just to avoid operating on menu separators I set all other menu items to TAG = -1
let main = NSApplication.shared().menu?.item(withTitle: "View")
let subMenuItems = main?.submenu?.items
for item in subMenuItems! {
if item.title == "Enable System Setup On Launch" {
item.isEnabled = enabled
} else if item.tag == -1 {
item.isEnabled = true
}
}
}