Я использую очень простое настраиваемое представление (содержащее только NSTextField и NSSegmentedControl только для чтения) в NSMenuItem (с использованием метода -setView:
). Эта часть работает как положено.
Проблема вот в чем: в методе делегата -menuNeedsUpdate:
NSMenu я условно скрываю пункт меню. Когда я вызываю [item setHidden:YES]
, пункт меню с настраиваемым видом не скрывается, но другие «ванильные» элементы меню скрываются.
Мое настраиваемое представление построено в собственном XIB, и я получаю к нему доступ через настраиваемый NSViewController.
Обновить
Пункт меню остается видимым, даже если я устанавливаю флажок «Скрытый» в Interface Builder и удаляю строку, в которой он скрыт в коде.
Обновление 2
Я также пробовал установить hidden
в пользовательском представлении до и после установки hidden
в пункте меню. Результат такой, как если бы пункт меню не был скрыт, но вид был скрыт; элементы управления представления не видны, но все еще есть пробел на том месте, где они должны быть.
Обновление 3
Я изменил пример кода Apple MenuItemView, чтобы скрыть один из элементы меню после его добавления (вставьте [menuItem setHidden:YES];
в строку 87), и он имеет тот же эффект, что и в моем коде (то есть, нет).
Я начинаю думать, что единственный способ скрыть этот пункт меню - установить его вид на nil
, когда мне нужно скрыть его, и вернуть обратно, когда мне нужно его показать, но это не кажется необходимым.
Обновление 4
Используя ответ Майка ниже, вот код, который я использую:
// Declared in the header file
IBOutlet NSMenuItem *previousMenuItem;
IBOutlet NSMenuItem *togglingMenuItem; //Needs to be RETAINED
. . .
- (void)menuNeedsUpdate:(NSMenu *)menu {
BOOL hideItem = YES; // Some criteria, obviously
// Remove the menu item, if it was already present
if ([menu indexOfItem:togglingMenuItem] >= 0) {
[menu removeItem:togglingMenuItem];
}
// Put it back if it should be visible
if (!onePageVisible) {
[menu insertItem:togglingMenuItem
atIndex:[menu indexOfItem:previousMenuItem] + 1];
}
}