2011-03-05 24 views
7

我在執行一些最初的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我已經在應用程序代理連接在NSMenustatusMenu(因此菜單中的所有顯示在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)
+1

你提到你創建了一個包含nib中應用程序委託類的對象;這個筆尖是否與指定實際上是應用程序委託的對象相同?如果沒有,我想知道你是否創建了兩個應用程序委託對象,這會導致問題(不是這一個),因爲它們中只有一個可以真正成爲委託。 – 2011-03-06 10:38:32

+0

您是否嘗試過記錄菜單,其菜單項以及有問題的項目的目標和操作? (使用'NSStringFromSelector'將動作選擇器轉換爲NSString。) – 2011-03-06 10:41:03

+0

感謝您的評論,我爲這個問題增加了一些內容,希望能夠澄清一些事情。 – Edwardr 2011-03-06 11:40:53

回答

1

編程,你有沒有嘗試過:

[statusItem setTarget:someTarget]; 
[statusItem setAction:@selector(someSelector)]; 

它應該工作。

相關問題