Cocoa 程式設計/狀態列專案
狀態列專案是在選單欄中安裝的圖示,靠近時鐘和其他 macOS 通用圖示,例如音量、Spotlight 等。這些圖示提供了一個位置來儲存,例如,應用程式的重要快捷方式,或者只是一個標識當前應用程式狀態的圖示;它們通常與選單相關聯。在本檔案中,我將解釋如何構建一個狀態列專案,而不是解釋所有包含在 Xcode 中的類參考,以及在 ADC 網站上可用的類參考。
程式碼
首先,您必須記住,您的狀態列專案是一個獨立的應用程式:當您關閉應用程式時,狀態列專案將被釋放。通常,狀態列專案用於控制和監控終端使用者看不到的程序,或者它們本身是某個東西的控制器(參見“QuickTunes”)。
我們建立一個名為“myStatusItem”的新類。狀態列專案類是 NSStatusItem,您需要在您的標頭檔案中例項化它,以及您需要的所有其他內容
#import <Cocoa/Cocoa.h>
@interface myStatusItem : NSObject {
IBOutlet NSMenu *myMenu;
NSStatusItem *statusItem;
NSImage *statusImage;
NSImage *statusAltImage;
}
@end
您如何看到我們引入了兩個影像,它們是狀態列專案的預設圖示和備用圖示,這些影像大小為 18x18。
下一步是編寫真正的程式,即“.m”檔案:我們必須告訴 MacOS 我們要安裝一個狀態列專案。這是透過以下程式碼行實現的
statusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength: NSSquareStatusItemLength] retain];
接下來,我們可以使用以下程式碼分配兩個影像
NSBundle *bundle = [NSBundle mainBundle];
statusImage = [[NSImage alloc] initWithContentsOfFile: [bundle pathForResource: @"statusIcon" ofType: @"png"]];
statusAltImage = [[NSImage alloc] initWithContentsOfFile: [bundle pathForResource: @"statusAltIcon" ofType: @"png"]];
然後是最後幾行程式碼,自定義我們的狀態列專案
[statusItem setImage: statusImage];
[statusItem setAlternateImage: statusAltImage];
[statusItem setMenu: myMenu];
[statusItem setToolTip: @"A tooltip"];
[statusItem setHighlightMode: YES];
最好再編寫另一個方法,即dealloc方法,在- (void) awakeFromNib方法之後,該方法是應用程式啟動後呼叫的主要方法。使用 dealloc,我們可以透過釋放不需要的一些東西來幫助記憶體管理,事實上,當這種情況發生時,我們的應用程式已經終止。使用這段程式碼,我們想要釋放構成圖示的影像
- (void) dealloc {
[statusImage release];
[statusAltImage release];
[super dealloc];
}
介面
當我們建立應用程式時,使用“cocoa 應用程式”模板,Xcode 也建立了一個 NIB 檔案,它包含我們程式的 UI 和資源。雙擊 NIB 以新增介面。由於我們已經編寫了程式碼並指定了一些出口和我們的類,因此我們可以透過轉到類檢視(在 Interface Builder 的主視窗中)並從類選單中選擇“讀取檔案...”來重新整理 NIB 標準內容;我們選擇我們的“.h”。myStatusItem 類將被選中,右鍵單擊它並例項化。接下來,在例項檢視中放置一個 NSMenu 專案並像您在程式碼中所做的那樣命名它,在本例中為“myMenu”。您可以在您的選單下新增 NSMenuItem(s) 併為它們新增操作。
連線程式碼和介面
Cocoa 使用出口來連線程式碼和介面。如果您記得,我們定義了一個出口,NSMenu:讓我們連線它!轉到例項檢視並選擇“藍色方框”,即您的應用程式的例項。開啟檢查器並轉到連接面板。正如您所見,這裡列出了“myMenu”。從應用程式例項到 NSMenu 圖示“myMenu”進行 Control-拖動,然後點選“連線”按鈕。就是這樣。現在,如果您按下構建和執行按鈕,您將在狀態列中看到一個 NSStatusItem。(您必須將兩個影像新增到專案中的活動目標中)。