Objective-C中的鼠标按下事件

3

我知道这个问题以前已经被问过很多次了,但是对我来说没有任何作用。下面的代码根本不起作用。

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

}

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

NSEvent *someEvent;

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

}

这是我的.h文件:
@interface test : NSWindow <NSWindowDelegate> {

}

有人可以解释一下如何使这个东西起作用吗?

3个回答

9

确保你的类继承自NSWindow并符合<NSWindowDelegate>协议。否则,那只是一个名为mouseDown的方法,而且没有人会调用它。

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

@interface test : NSWindow <NSWindowDelegate> {  

} 

换句话说,不要在接口定义或.h文件中的任何其他位置放置mouseDown的原型。
在您的实现文件(.m)中只需要放置该方法:
- (void) mouseDown:(NSEvent*)someEvent {         
    NSLog(@"It worked!");          
} 

假设你已经在设备上开启了日志记录(你确定可以从程序的其他地方读取NSLog输出吗?),你应该会在那里看到打印出“它奏效了!”的信息。
我并不是obj-C专家,但我认为通过将mouseDown原型放在接口定义中,你基本上创建了自己的自定义mouseDown方法,这隐藏了“真正”的方法。这告诉编译器不要在窗口点击时调用你的mouseDown方法。

我已经做了那个,但它就是不起作用。我将编辑帖子以展示我所做的一切。 - Justin
我不知道如何显示警告。是的,在这个程序中,其他东西可以发送 NSLogs。 - Justin
另一个可能性是您的窗口上有一个视图拦截并处理鼠标事件(这意味着它们永远不会到达您的窗口)。 - MusiGenesis
5
@Justin,你是否真的将MainMenu.xib中窗口的类从NSWindow改为了test?仅仅定义一个类是不够的。你必须要实例化该类(即创建一个对象),才能让方法正常工作。 - Dave DeLong
@MusiGenesis 是的,我已经标记它,请求管理员将其解锁并重新打开,并提供这个答案作为证明它是一个真实的问题。也许不是非常“描述性”的问题,但无论如何都是一个真实的问题。 - Dave DeLong
显示剩余6条评论

4

你的子类必须有一个NSResponder的父类,否则你将无法获得任何事件。


什么是子类?你的意思是 "@interface test : NSWindow <NSWindowDelegate> {" 中的 "test" 是一个子类吗? - Justin
抱歉,我没有意识到你的类是NSWindow的子类,而NSWindow又是NSResponder的子类。 - David
我甚至不知道什么是子类。谢谢你指出来! - Justin
@Justin:你应该阅读这个:http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/OOP_ObjC/ - Peter Hosey
1
这应该是被接受的答案,它不需要是NSWindow的子类。但它确实需要是NSResponder的子类。 - Kyle Zaragoza

0
你正在覆盖NSWindow类,应该覆盖NSWindow类的NSView“contentView”以捕获鼠标事件。窗口外的大部分装饰(NSViews)都是私有的。
只需创建一个新的NSView,覆盖mouseDown等方法,并将其作为内容视图添加到NSWindow对象中即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接