2011-05-03 77 views
4

我在NSMenuItem(使用-setView:方法)中使用了一個非常簡單的自定義視圖(僅包含只讀NSTextField和NSSegmentedControl)。這部分按預期工作。如何隱藏自定義視圖的菜單項?

下面是問題:在-menuNeedsUpdate: NSMenu委託方法我有條件地隱藏菜單項。當我打電話給[item setHidden:YES]時,具有自定義視圖的菜單項不會隱藏,但其他「香草」菜單項卻可以。

我的自定義視圖是在它自己的XIB中構建的,我通過自定義的NSViewController訪問它。即使我檢查在Interface Builder中隱藏複選框,並刪除它是隱藏在代碼行

更新

菜單項保持可見。

更新2

我也嘗試過和菜單項設置hidden後的自定義視圖設置hidden。結果就好像菜單項不隱藏,但視圖是;視圖的控件不可見,但它們應該存在差距。

更新3

我修改蘋果的MenuItemView示例代碼隱藏菜單項之一它的加入後(第87行插入[menuItem setHidden:YES];),它有在我的代碼相同的效果(這是說,沒有)。

我開始認爲隱藏這個菜單項的唯一方法是將其視圖設置爲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]; 
    } 
} 

回答

1

而不是隱藏的物品,可以刪除/重根據需要添加?

[rootMenu removeItemAtIndex: 23]; 
+0

我試圖擺脫這個特定的控制器沒有任何引用特定的菜單項,但這可能是最好的方式去。 – Dov 2011-05-03 16:21:56

+1

我必須承認有一個很深的偏見:完成它,運送它,準確地確定它爲什麼做/不作爲讀者的練習。祝你好運。 – Rayfleck 2011-05-03 16:37:48

+0

阿門,@Mike。阿門。 – Dov 2011-05-03 16:47:01

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

}

+0

'menuItemHeight'在哪裏定義?我沒有在NSMenuItem的文檔中看到它。 – Dov 2011-05-03 18:42:30

+0

這是我自己的方法(我認爲默認高度是19.0,您可以替換它) – 2011-05-03 19:02:35

0

在菜單的委託方法菜單:的updateItem:atIndex: shouldCancel:通過標籤找到我的自定義視圖菜單項,並將其視圖設置爲零,如果它隱藏或指定自定義視圖如果可見:

- (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; 
}