3

我知道这个问题以前被问过很多次,但对我没有任何用处。下面的代码根本不会做任何事情。

- (void) mouseDown:(NSEvent*)event {
    NSLog(@"It worked!");

}

我已经尝试了很多不同的方法来让它工作,包括NSEvents以这种方式创建自定义:

NSEvent *someEvent;

- (void) mouseDown:(NSEvent*)someEvent {
    NSLog(@"It worked!");

}

这是我的 .h 文件:

@interface test : NSWindow <NSWindowDelegate> {

}

有人会解释如何使它做某事吗?

4

3 回答 3

9

确保您的类继承NSWindow并符合<NSWindowDelegate>协议。否则,这只是一个碰巧被命名的方法,mouseDown没有人会调用它。

更新: 更改您的头文件,使其看起来像这样:

@interface test : NSWindow <NSWindowDelegate> {  

} 

换句话说,不要将原型mouseDown放在接口定义内或文件中的任何其他位置.h

在你的实现文件 ( .m) 中只放方法:

- (void) mouseDown:(NSEvent*)someEvent {         
    NSLog(@"It worked!");          
} 

假设您在设备中打开了日志记录(您确定可以NSLog从程序中的其他位置读取输出吗?),您应该看到“它工作了!” 印在那里。

我无论如何都不是 obj-C 专家,但我认为通过将mouseDown原型放在接口定义中,您基本上是在创建自己的自定义mouseDown方法,它隐藏了“真实”的方法。这向编译器表明它不应该mouseDown单击窗口时调用您的方法。

于 2011-04-04T19:42:18.690 回答
4

你的子类必须有一个 NSResponder 的父类,否则你不会得到任何事件。

于 2011-04-04T19:44:29.203 回答
0

您正在覆盖 NSWindow 类,您应该覆盖 NSWindow 类的 NSView“contentView”以捕获鼠标事件。contentView 之外的窗口上的大部分装饰(NSView)都是私有的。

只需创建一个覆盖 mouseDown 等的新 NSView 并将其作为内容视图添加到 NSWindow 对象。

于 2015-05-30T19:59:54.320 回答