NSMenuItem で (メソッドを使用して) 非常に単純なカスタム ビュー (読み取り専用の NSTextField と NSSegmentedControl のみを含む) を使用してい-setView:
ます。この部分は期待どおりに機能します。
問題は次の-menuNeedsUpdate:
とおりです。NSMenu デリゲート メソッドで、条件付きでメニュー項目を非表示にしています。を呼び出す[item setHidden:YES]
と、カスタム ビューのメニュー項目は非表示になりませんが、他の「バニラ」メニュー項目は非表示になります。
私のカスタム ビューは独自の XIB に組み込まれており、カスタム NSViewController を介してアクセスしています。
アップデート
Interface Builder で [非表示] チェックボックスをオンにしても、メニュー項目は表示されたままになり、コードで非表示になっている行を削除します。
更新 2
メニュー項目hidden
に設定する前後に、カスタムビューにも設定してみました。hidden
結果は、メニュー項目が非表示になっていないかのようですが、ビューは非表示になっています。ビューのコントロールは表示されませんが、表示されるはずの場所にまだギャップがあります。
アップデート 3
Apple のMenuItemViewサンプル コードを変更して、追加後にメニュー項目の 1 つを非表示にしました ( [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];
}
}