2011-09-09 10 views
7

Wprowadzam kilka przycisków programowo i próbuję ustawić akcję dla każdej z nich, ale nie mogę sprawić, żeby działała.Objective-c: Zestaw przycisków NSA nie działa

W moim AppController.h mam ten kod:

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

i

- (IBAction) zoomIn : (id) sender; 

- (IBAction) zoomOut : (id) sender; 

aw AppController.m w metodzie 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]; 

i

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

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

ale zoomout i zoomin nie oberwać ...

+4

Spróbuj ustawić 'target' również. – PengOne

+0

Jeśli nie korzystasz z ARC lub GC, nie zapomnij zwolnić lub zrezygnować z obrazu i przycisków. –

Odpowiedz

28

Najbardziej prawdopodobnym powodem jest to, że nie ma obiektu w responder chain for action messages odpowiedzi na te działania. Kiedy określasz akcję, ale nie określasz celu, Cocoa próbuje znaleźć obiekt, który odpowiada na te komunikaty akcji, przechodząc przez łańcuch odpowiadający.

Albo upewnij się, że masz odpowiedni obiekt w łańcuchu reagujących lub, jeśli masz odniesienie do tego obiektu, należy określić go jako cel tych działań:

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

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

Nie mogłem dowiedzieć się, dlaczego mój setAction nie działał nawet z setTarget.

Problem był ja podklasy NSButton i overrode onMouseDown i zapomniał zadzwonić super.onMouseDown

Powiązane problemy