Не может показаться 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
        }
    }
}