Невозможно установить setEnabled: NO в NSMenuItem - PullRequest
19 голосов
/ 21 февраля 2012

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

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

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

Ответы [ 8 ]

58 голосов
/ 07 мая 2013

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

В IB:

You should uncheck

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

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

// Test it
[myMenuButton setEnabled:NO];
[myMenuButton setEnabled:YES];
12 голосов
/ 24 февраля 2012

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

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

- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
    return [menuItem isEnabled];
}
9 голосов
/ 05 марта 2017

enter image description here

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

4 голосов
/ 20 декабря 2013

Добавляя к ответу его давых, если пункт меню находится внутри одного или нескольких подменю, вам нужно только снять флажок с свойства «Auto enable items» в подменю пункта меню, а не в других родительских меню.

4 голосов
/ 20 февраля 2013

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

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

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

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

3) Откройте инспектор Атрибутов для вашего узла «Новое меню» и отключите опцию «Auto Enables Items»:

http://i.imgur.com/YLZKFam.jpg (пожалуйста, смотрите изображение здесь, я не могу опубликовать егопрямо сейчас).

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

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

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

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

0 голосов
/ 21 апреля 2017

Swift 3 ответ:

У меня есть пункт подменю в стандартном меню «Вид» под названием «Включить настройку системы при запуске». Я использую функцию ниже, чтобы включить или отключить пункт меню. Примечание: меню представления требует выключения «Auto Enable Items» в 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
        }
    }
}
0 голосов
/ 11 ноября 2013

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

0 голосов
/ 21 февраля 2012

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

...