Кажется, не удается установитьEnabled:NO на NSMenuItem

Я создал подкласс NSMenu и соединил группу NSMenuItem через Interface Builder. Я проверил через отладчик, чтобы убедиться, что они действительно инициализируются.

Меню настроено так, чтобы элементы не включались автоматически. Тем не менее, когда я устанавливаю для любого из моих NSMenuItem значение [myMenuItem setEnabled:NO], они продолжают работать. Даже если я вызову [self update] из подкласса NSMenu.

Что мне не хватает?


person Christoffer    schedule 20.02.2012    source источник
comment
Эй, опубликуйте свое решение в качестве ответа, а затем вы сможете принять его через пару дней.   -  person paulmelnikow    schedule 22.02.2012


Ответы (8)


Была такая же проблема, поэтому я решил опубликовать свое решение. NSMenu автоматически включает NSMenuButtons, поэтому мы должны переопределить это.

In IB:

Вы должны снять флажок

Или программно:

// Disable auto enable
[myMenu setAutoenablesItems:NO];

// Test it
[myMenuButton setEnabled:NO];
[myMenuButton setEnabled:YES];
person vqdave    schedule 06.05.2013
comment
8 лет спустя этот ответ все еще актуален ???? - person Don; 14.05.2021

Я решил это с помощью коллеги, поэтому я размещаю его здесь для других, которые испытывают ту же проблему.

Вы должны настроить свой NSMenu-sublass на автоматическое включение элементов (поведение по умолчанию), а затем реализовать этот метод в NSMenu-sublass.

- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
    return [menuItem isEnabled];
}
person Christoffer    schedule 23.02.2012

введите описание изображения здесь

Вы должны снять флажок Автоматическое включение элементов в ближайшем родительском NSMenu.

person onmyway133    schedule 05.03.2017

Вы можете решить эту проблему без подкласса.

Если вам нужно только стандартное меню + некоторые пользовательские NSMenuItem, которые можно отключить на вашем элементе управления, вы можете просто:

  1. Добавьте еще один узел меню — просто перетащите элемент меню подменю из библиотеки объектов в свое меню.

  2. Добавьте все NSMenuItems, которыми вы хотите управлять, в этот новый узел меню.

  3. Откройте инспектор атрибутов для узла «Новое меню» и отключите параметр «Автоматическое включение элементов»:

    Автоматическое включение элементов

  4. настроить любые другие параметры вашего меню и пунктов.

Теперь вы можете написать такой код:

@property (weak) IBOutlet NSMenuItem *hidePlateMenuItem;
...
[self.hidePlateMenuItem setEnabled:NO];

и это будет работать хорошо.

person ibovkush    schedule 20.02.2013

Добавление к ответу itsdavyh, если пункт меню находится внутри одного или нескольких подменю, вам нужно только снять флажок «Автоматическое включение элементов» в подменю пункта меню, а не в каких-либо других родительских меню.

person Yannick De Turck    schedule 20.12.2013

Я пробовал все эти решения, но, наконец, нашел реальную проблему, которая также имеет для меня больше смысла. Это также самый простой способ обработки отключенного nsmenuitem, который не требует подкласса или кода. nsmenuitem перед тем, как стать дочерним элементом самого меню, является дочерним элементом основного элемента, например, «Сохранить как ...» является дочерним элементом «Файл». Просто выберите родительский элемент (в данном примере это Файл) и установите флажок «Автоматическое включение элементов меню» в панели просмотра меню, и готово!

person Community    schedule 11.11.2013

Свифт 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
        }
    }
}
person John Carto    schedule 21.04.2017

Попробуйте вызвать [myMenuItem setEnabled:NO] из другого места и убедитесь, что это происходит после загрузки пера, содержащего меню. Может быть, сделать это прямо в подклассе NSMenu awakeFromNib.

person Wienke    schedule 21.02.2012
comment
Я сделал несколько быстрых тестов и вижу, что awakeFromNib всегда запускается до [myMenuItem setEnabled:NO]. Как вы предложили, я попытался обновить элемент меню внутри awakeFromNib, но это тоже не дало никакого эффекта. - person Christoffer; 21.02.2012