Cocoa开发之从菜单中添加和移除子菜单

问题:Cocoa中如何从一个菜单中添加和移除一个子菜单?

使用NSMenu方法insertItem:atIndex:removeItemAtIndex:去添加或者移除子菜单,也就是NSMenuItem。

在Cocoa中一个子菜单也就是NSMenu的实例,它只是碰巧附加到高级菜单中的一个项目。换句话说,菜单是分层的,子菜单是“顶层”菜单之外的任何菜单。当你想要添加或者移除一个子菜单时,只需要简单使用NSMenu方法去添加或者移除NSMenuItem。是否附加了子菜单并不重要(hasSubmenu)。可以在NSMenuNSMenuItem类引用文档中参考更多方法。

为了给出一个添加或删除子菜单的例子,让我们假设您希望根据某种条件提供一个附加的管理工具子菜单,下图展示添加一个名为“Admin Tools”的NSMenuItem,它内部也是一个有三个NSMenuItem的NSMenu。

![2E39C322-F06C-4B0F-8163-39010B7980D3](/Users/mac123/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/819954692/QQ/Temp.db/2E39C322-F06C-4B0F-8163-39010B7980D3.png)

注意:尽管本例中使用应用的菜单栏距离,但是该技术同样适用于其他菜单按钮,例如附加到视图的上下文菜单。

一个可选方案是通过代码创建“Admin Tools”菜单项,然后可以通过setSubmeu:添加子菜单。然而,本例将采用更通用的方式:通过Xib创建所有的子菜单并连接一个outlet属性(此处指adminMenuItem)引用它。所有的菜单项都可给予某些条件添加或者删除,例如验证成功等。

@property (retain) IBOutlet NSMenuItem *adminMenuItem;

![9111D8D6-2C45-4CD1-B365-2D3D4F691E4D](/Users/mac123/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/819954692/QQ/Temp.db/9111D8D6-2C45-4CD1-B365-2D3D4F691E4D.png)

下面的代码展示了如何在加载nib文件时通过删除项来设置初始状态,并提供了根据需要添加或删除它的方法。本例中的controller保留菜单项的索引为adminMenuItemIndex属性,以方便之后恢复到同一位置。

Listing 1:在nib文件加载完成后移除菜单按钮

- (void) awakeFromNib {     
    adminMenuItemIndex = [[NSApp mainMenu] indexOfItem: adminMenuItem];    
    [self removeAdminMenuItem]; 
}

Listing 2:通过outlet属性移除子菜单

- (void)removeAdminMenuItem {
    [adminMenuItem retain];
    [[NSApp mainMenu] removeItem:adminMenuItem];
}

Listing 3:向应用的菜单栏添加子菜单

- (void) addAdminMenuItem {
    [[NSApp mainMenu]insertItem: adminMenuItem atIndex:adminMenuItemIndex]; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值