4

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];
    }
}
4

4 に答える 4

1

アイテムを非表示にするのではなく、必要に応じて削除/再追加できますか?

 [rootMenu removeItemAtIndex: 23];
于 2011-05-03T16:20:32.157 に答える
1

メニュー デリゲート メソッド menu:updateItem:atIndex:shouldCancel: で、カスタム ビュー メニュー項目をタグで見つけ、それが非表示の場合はビューを nil に設定し、表示されている場合はカスタム ビューを割り当てます。

- (BOOL)menu:(NSMenu *)menu 
    updateItem:(NSMenuItem *)item 
    atIndex:(NSInteger)index 
    shouldCancel:(BOOL)shouldCancel
{

    if ([item tag] == CUSTOM_VIEW_TAG)
    {
        [item setView:[item isHidden]?nil:customView];
        return NO; //we've done our dirty work
    }

    return YES;
}
于 2012-03-09T00:24:13.723 に答える
0

次のように、NSMenuItem の setHidden: メソッドをオーバーライドし、非表示の場合はビューの高さをゼロに設定する必要がありました。

- (void) setHidden:(BOOL)flag {

[super setHidden:flag];

NSView *view = [self view];
[view setHidden:flag];

// if our view is hidden, give it a zero height so it won't draw at all
if (flag)
    [view setFrameSize:NSMakeSize([view frame].size.width, 0)];
else {

    [view setFrameSize:NSMakeSize([view frame].size.width, [self menuItemHeight])];
}

}

于 2011-05-03T18:05:27.803 に答える