我正在以编程方式制作几个按钮并试图为每个按钮设置一个动作,但我似乎无法让它工作。
在我的AppController.h中我有这段代码:
...
IBOutlet NSButton* btnZoomIn;
IBOutlet NSButton* btnZoomOut;
...
和
- (IBAction) zoomIn : (id) sender;
- (IBAction) zoomOut : (id) sender;
并在awakeFromNib方法中的AppController.m中:
/*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];
和
- (IBAction) zoomIn : (id) sender {
NSLog(@"zoom in!");
}
- (IBAction) zoomOut : (id) sender {
NSLog(@"zoom out!");
}
但是zoomOut和zoomIn没有被击中......
答案 0 :(得分:28)
最可能的原因是responder chain for action messages中没有任何对象响应这些操作。当您指定操作但未指定目标时,Cocoa会尝试通过遍历响应程序链来查找响应这些操作消息的对象。
确保在响应者链中有合适的对象,或者,如果您有对该对象的引用,请将其指定为这些操作的目标:
[btnZoomIn setAction:@selector(zoomIn:)];
[btnZoomIn setTarget:objectThatRespondsToZoomIn];
[btnZoomOut setAction:@selector(zoomOut:)];
[btnZoomOut setTarget:objectThatRespondsToZoomOut];
答案 1 :(得分:0)
我无法弄清楚为什么我的setAction
即使使用setTarget
也无效。
问题是我已将NSButton
分组并覆盖onMouseDown
而忘记致电super.onMouseDown
答案 2 :(得分:0)
此问题的另一个原因可能是按钮(或创建按钮的包含类(或创建创建按钮的包含类的包含类))没有存储并且超出了范围。
如果您在viewDidLoad中的按钮上调用onClick()可以正常工作,但是事后手动单击该按钮却没有,那么这就是您的问题。
答案 3 :(得分:0)
添加:
[btnZoomIn setTarget:self];
[btnZoomOut setTarget:self];