简介
状态栏展现了一组与用户交互或给用户反馈的状态项,比如反映应用状态的菜单或者图片。 系统级的状态栏在菜单栏最右边。 这是目前唯一可用的状态栏。
慎用状态栏!只有当其他方式(Dock菜单,偏好设置面板或者状态窗口)仍然不能满足需求时,才能使用状态栏。因为菜单栏中显示状态项的地方很有限。状态项并不一定能一直显示。 因此,不要依赖状态项,应该总是让用户可以设置隐藏应用的状态项,来减少菜单栏的空间。
关于何时使用状态栏,参考 Aqua Human Interface Guidelines.
状态栏的作用,见“关于状态栏”
示例代码,以及如何创建状态项,见”创建状态项“
关于状态栏
状态栏展现了一组与用户交互或给用户反馈的状态项。状态项可以是文字,也可以是图标。 状态项可以展示菜单,或者点击的时候触发一个事件,也可以完全自定义。
目前,只有一个状态栏可用,也就是系统状态栏。 如图1,状态栏在整个系统的菜单栏上。状态项在菜单栏的右边,菜单栏时钟和菜单附加项(比如桌面和声音菜单)的左边。即使应用当前没有在前台运行,状态项也一直停留在菜单栏上。
图1 系统状态栏
每一个新的状态项,都添加在已有状态项左边。 当删除一个状态项时,左边的项右移一格占据被删除项原来的位置。如果状态栏超过了当前应用的菜单栏,那么,最左边的状态项将被隐藏,以腾出空间显示完整的菜单。
创建状态项
获取状态栏时,使用类方法 systemStatusBar。 不要自己生成状态栏的实例。
创建状态项并分配空间,使用 statusItemWithLength:。参数为状态项的宽度,单位像素。
常量 NSSquareStatusItemLength 和 NSVariableStatusItemLength 分别用来设置状态项的宽度等于状态栏的厚度(厚度通过thickness方法获取),和基于状态项内容的变量。前者用来显示图标,后者用来显示静态文本。
由于系统状态栏是所有应用公用的,因此它本身不能持有每一个应用的状态项对象的引用。相反的,每一个应用都应该自己持有自己的状态项,那么配置变化时,每一个状态项都能和状态栏交互。当被释放时,状态项将自己从状态栏移除。 根据常规Cocoa 内存管理规则,必须使用 statusItemWithLength:
来持有对象。
一旦创建了状态项对象,就可以设置标题、菜单、监听事件、提示等等。
下面的例子中,在菜单栏中添加了一个状态项,并分配了菜单。
- (void)activateStatusMenu
{
NSStatusBar *bar = [NSStatusBar systemStatusBar];
theItem = [bar statusItemWithLength:NSVariableStatusItemLength];
[theItem retain];
[theItem setTitle: NSLocalizedString(@"Tablet",@"")];
[theItem setHighlightMode:YES];
[theItem setMenu:theMenu];
}
上述例子,假设已经有一个实例变量theMenu,表示一个NSMenu对象,可能是从nib文件中关联而来的。同时还有另一个实例变量theItem,表示持有的状态项。运行上述代码时,菜单栏右侧会添加一个名叫”Tablet“(或者响应的本地化字符串)的菜单。只要该应用在运行,这个菜单就一直可用,状态项也一直存在。