2012-02-20 2 views
14

Я подклассифицировал NSMenu и связал связку NSMenuItem с помощью Interface Builder. Я тестировал через отладчик, чтобы убедиться, что они действительно инициализируются.Не может показаться setEnabled: НЕТ на NSMenuItem

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

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

+0

Эй, отправляйте свое решение в качестве ответа, а затем вы можете принять его через пару дней. – paulmelnikow

ответ

12

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

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

- (BOOL)validateMenuItem:(NSMenuItem *)menuItem { 
    return [menuItem isEnabled]; 
} 
0

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

+0

Я сделал som быстрых тестов, и я вижу, что awakeFromNib всегда запускается до '[myMenuItem setEnabled: NO]'. Как вы предположили, я попробовал обновить menuItem внутри 'awakeFromNib', но это тоже не имело никакого эффекта. – Christoffer

4

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

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

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

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

3) Открыть атрибуты инспектора для нового узла меню и выключить Auto Включает опцию Items:

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

4) конфигурируйте другие варианты вашего меню & элементов.

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

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

и точно работает хорошо.

43

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

В IB:

You should uncheck "Auto Enables Items"

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

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

// Test it 
[myMenuButton setEnabled:NO]; 
[myMenuButton setEnabled:YES]; 
+0

Кто-нибудь даст этому человеку свои очки! – Shizam

0

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

2

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

2

enter image description here

Вы должны снимите Auto Включает товары на ближайших родительского NSMenu

0

Swift 3 ответа:

У меня есть пункт подменит под стандартным меню "View" под названием " Включить настройку системы при запуске ". Я использую функцию ниже, чтобы включить или отключить пункт меню. Примечание: в меню просмотра необходимо, чтобы «Автообновляемые элементы» в 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 
     } 
    } 
}