2011-09-09 23 views
7

Estoy haciendo un par de botones programáticamente y tratando de establecer una acción para cada uno, pero parece que no puedo hacer que funcione.Objective-c: NSButton setAction no funciona

En mi AppController.h tengo este código:

... 
IBOutlet NSButton* btnZoomIn; 
IBOutlet NSButton* btnZoomOut; 
... 

y

- (IBAction) zoomIn : (id) sender; 

- (IBAction) zoomOut : (id) sender; 

y en AppController.m dentro del método awakeFromNib:

/*zoom in and out buttons*/ 

//get the path to the image files 
NSString* zoomInImgPath = [[NSBundle mainBundle] pathForResource:@"zoomIn" ofType:@"png"]; 
NSString* zoomOutImgPath = [[NSBundle mainBundle] pathForResource:@"zoomOut" ofType:@"png"]; 

//declare the NSImages 
zoomInImg = [[NSImage alloc] initWithContentsOfFile:zoomInImgPath]; 
zoomOutImg = [[NSImage alloc] initWithContentsOfFile: zoomOutImgPath]; 

//button making! 
//zoomIn 
btnZoomIn = [[NSButton alloc] initWithFrame:NSMakeRect(1426.0, 920.0, 25.0, 25.0)]; 
[btnZoomIn setButtonType:NSMomentaryPushInButton]; 
[btnZoomIn setTitle:@""]; 
[btnZoomIn setToolTip:@"Zoom In"]; 
[btnZoomIn setImage:zoomInImg]; 
[btnZoomIn setAction:@selector(zoomIn:)]; 
[[mainWin contentView] addSubview:btnZoomIn]; 

//zoomOut 
btnZoomOut = [[NSButton alloc] initWithFrame:NSMakeRect(1456.0, 920.0, 25.0, 25.0)]; 
[btnZoomOut setButtonType:NSMomentaryPushInButton]; 
[btnZoomOut setTitle:@""]; 
[btnZoomOut setToolTip:@"Zoom Out"]; 
[btnZoomOut setImage:zoomOutImg]; 
[btnZoomOut setAction:@selector(zoomOut:)]; 
[[mainWin contentView] addSubview:btnZoomOut]; 

y

- (IBAction) zoomIn : (id) sender { 
    NSLog(@"zoom in!"); 
} 

- (IBAction) zoomOut : (id) sender { 
    NSLog(@"zoom out!"); 
} 

pero zoomOut y zoomIn no ser golpeado ...

+4

intente configurar el 'target' también. – PengOne

+0

Si no está usando ARC o GC, no olvide liberar o liberar automáticamente las imágenes y los botones. –

Respuesta

28

La razón más probable es que no hay ningún objeto en el responder chain for action messages responder a esas acciones. Cuando especifica una acción pero no especifica un objetivo, Cocoa intenta encontrar un objeto que responda a esos mensajes de acción atravesando la cadena de respuesta.

Cualquiera de asegurarse de que tiene un objeto adecuado en la cadena de respuesta o, si tiene una referencia a ese objeto, especificar como el destino de esas acciones:

[btnZoomIn setAction:@selector(zoomIn:)]; 
[btnZoomIn setTarget:objectThatRespondsToZoomIn]; 

[btnZoomOut setAction:@selector(zoomOut:)]; 
[btnZoomOut setTarget:objectThatRespondsToZoomOut]; 
0

no pude averiguar por qué mi setAction no funcionaba incluso con setTarget.

El problema era que había una subclase NSButton y pasó por encima de onMouseDown y se olvidó de llamar super.onMouseDown

Cuestiones relacionadas