我在執行一些最初的Cocoa編程時遇到了一些實際的困難。在可可中爲NSMenuItem設置目標/動作的正確方法?
本質上,我有一個NSStatusBar
項目NSMenu
作爲菜單附加。菜單有一個NMMenuItem
。在IB中,我將NSMenuItem連接到NSObject
,它本身被設置爲ApplicationDelegate的類;然後,我在ApplicationDelegate中將接收到的操作設置爲IBAction
方法。我認爲所有東西都正確地連接起來,除非我運行程序並單擊菜單項IBAction
方法未被調用。我似乎無法解決這個問題。這是相關的代碼。
應用程序委託.h文件:
#import <Cocoa/Cocoa.h>
@interface sssAppDelegate : NSObject <NSApplicationDelegate> {
IBOutlet NSMenu *statusMenu;
NSStatusItem *statusItem;
}
- (IBAction)showPreferencePanel:(id)sender;
@end
應用程序委託米文件:
#import "sssAppDelegate.h"
@implementation sssAppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application
}
-(void)awakeFromNib{
statusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength] retain];
[statusItem setMenu:statusMenu];
[statusItem setTitle:@"Status"];
[statusItem setHighlightMode:YES];
}
- (IBAction)showPreferencePanel:(id)sender {
NSLog(@"Hello World!");
}
@end
正如我說,在IB我已經在應用程序代理連接在NSMenu
到statusMenu
(因此菜單中的所有顯示在NSStatusBar
下),並且我已將NSMenu
中的NSMenuItem
連接到帶有應用程序委託類的NSObject
,並將其掛接到t o調用showPreferencePanel,但是當我運行它時沒有任何反應!
我嘗試了編程方式,但仍然無法調用IBAction方法。
編輯:我會附上一些屏幕抓取以顯示在IB的設置,但我還沒有被允許。
主要筆尖其中包含被添加到NSStatusBar
菜單,它看起來像這樣:
- FO
NSApplication
- FR
FirstResponder
- 應用
NSApplication
- 字體經理
NSFontManager
- 主菜單
NSMenu
- 菜單項(偏好)
NSMenuItem
- 菜單項(偏好)
- SSS應用代表
sssAppDelegate
NSMenuItem:
- 發送的動作 -
showPreferencePanel
--->Sss App Delegate
SSS應用代表:
個- 奧特萊斯 -
statusMenu
--->Main Menu
- 收到的動作 -
showPreferencePanel:
--->Main Item (Preferences)
你提到你創建了一個包含nib中應用程序委託類的對象;這個筆尖是否與指定實際上是應用程序委託的對象相同?如果沒有,我想知道你是否創建了兩個應用程序委託對象,這會導致問題(不是這一個),因爲它們中只有一個可以真正成爲委託。 – 2011-03-06 10:38:32
您是否嘗試過記錄菜單,其菜單項以及有問題的項目的目標和操作? (使用'NSStringFromSelector'將動作選擇器轉換爲NSString。) – 2011-03-06 10:41:03
感謝您的評論,我爲這個問題增加了一些內容,希望能夠澄清一些事情。 – Edwardr 2011-03-06 11:40:53