Я использую очень простое пользовательское представление (содержащее только NSTextField и NSSegmentedControl только для чтения) в NSMenuItem (используя метод -setView:
). Эта часть работает как положено.
Вот проблема: в методе делегата -menuNeedsUpdate:
NSMenu я условно скрываю пункт меню. Когда я звоню [item setHidden:YES]
, пункт меню с пользовательским представлением не скрывается, а другие «ванильные» пункты меню скрываются.
Мое собственное представление построено на собственной XIB, и я обращаюсь к нему через пользовательский NSViewController.
Обновление
Пункт меню остается видимым, даже если я установил флажок Скрытый в Интерфейсном Разработчике и удалил строку, где он скрыт в коде.
Обновление 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];
}
}