2011-03-05 10 views
7

Tengo algunas dificultades reales con la programación inicial de Cocoa que estoy llevando a cabo.¿Forma correcta de configurar el objetivo/acción para NSMenuItem en Cocoa?

Básicamente, tengo un artículo NSStatusBar con un NSMenu adjunto como menú. El menú tiene un solo NMMenuItem. En IB, he conectado NSMenuItem a un NSObject, que está configurado en la clase ApplicationDelegate; Luego configuré las Acciones Recibidas en un método IBAction en ApplicationDelegate. Todo está conectado correctamente. Creo que, excepto cuando ejecuto el programa y hago clic en el elemento del menú, no se llama al método IBAction. Realmente no puedo resolverlo. Aquí está el código relevante.

Aplicación archivo Delegado h:

#import <Cocoa/Cocoa.h> 

@interface sssAppDelegate : NSObject <NSApplicationDelegate> { 
    IBOutlet NSMenu *statusMenu; 
    NSStatusItem *statusItem; 
} 

- (IBAction)showPreferencePanel:(id)sender; 

@end 

Aplicación Delegado m archivo:

#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 

Como digo, en IB He conectado el NSMenu a statusMenu en el Delegado de aplicación (por lo tanto el menú de todos aparece bajo NSStatusBar), y he conectado un NSMenuItem dentro del NSMenu con el NSObject con la clase Delegado de aplicaciones, y lo conecté t o llame a showPreferencePanel, pero no pasa nada cuando lo ejecuto !!!

Lo probé programáticamente también, pero todavía no se puede llamar al método IBAction.

Editar: Adjuntaré algunas capturas de pantalla para mostrar la configuración en IB pero aún no estoy autorizado.

La punta principal que contiene el menú que se agrega a la NSStatusBar, que se parece a esto:

  • FO NSApplication
  • FR FirstResponder
  • Aplicación NSApplication
  • Administrador de fuentes NSFontManager
  • Menú principal NSMenu
    • de elementos del menú (Preferencias) NSMenuItem
  • Sss App Delegado sssAppDelegate

NSMenuItem:

  • acciones Enviados - showPreferencePanel --->Sss App Delegate

Sss App Delegado:

  • Outlets - statusMenu --->Main Menu
  • acciones recibidas - showPreferencePanel: --->Main Item (Preferences)
+1

Menciona que ha creado un objeto con la clase del delegado de la aplicación en el plumín; ¿Es esta punta el mismo en el que designó el objeto como el delegado de la aplicación? Si no, me pregunto si ha creado dos objetos delegados de aplicación por accidente, lo que causa problemas (no este) porque solo uno de ellos puede ser realmente el delegado a la vez. –

+0

¿Ha intentado iniciar sesión en el menú, sus elementos de menú y el elemento en cuestión y la acción? (Use 'NSStringFromSelector' para convertir el selector de acciones en un NSString.) –

+0

Gracias por los comentarios, he agregado algo más a la pregunta que con suerte aclarará un poco las cosas. – Edwardr

Respuesta

1

mediante programación, ¿ha intentado:

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

Se debe trabajar.

Cuestiones relacionadas