【问题标题】:Mouse Down events in Objective-CObjective-C 中的鼠标按下事件
【发布时间】:2011-07-29 10:08:56
【问题描述】:

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

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

}

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

NSEvent *someEvent;

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

}

这是我的 .h 文件:

@interface test : NSWindow <NSWindowDelegate> {

}

有人能解释一下如何让它做某事吗?

【问题讨论】:

    标签: objective-c cocoa mouse nsevent


    【解决方案1】:

    确保您的类继承自 NSWindow 并符合 &lt;NSWindowDelegate&gt; 协议。否则,这只是一个恰好被命名为mouseDown 的方法,并且没有人会调用它。

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

    @interface test : NSWindow <NSWindowDelegate> {  
    
    } 
    

    换句话说,不要mouseDown的原型放在接口定义中,或.h文件中的任何其他地方。

    在您的实现文件 (.m) 中只输入方法:

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

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

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

    【讨论】:

    • 我已经这样做了,但是它不起作用。我将编辑帖子以显示我所做的一切。
    • 对更新的响应。我已经这样做了(我只是忘了分开 .h 和 .m 文件的代码。
    • @Justin:你确定它不起作用吗?单击窗口的唯一效果是在日志中写入一些内容。您确定您的应用程序能够写入日志并且您能够读取日志吗?如果您显示警告对话框而不是写入日志会发生什么?
    • 我不知道如何显示警报。是的,这个程序中的其他东西可以发送 NSLogs。
    • @Justin 你真的将 MainMenu.xib 中的窗口类从 NSWindow 更改为 test 吗?简单地定义一个类是不够的。您必须有该类的实际实例化(即对象)才能使方法起作用。
    【解决方案2】:

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

    【讨论】:

    • 什么是子类?您的意思是“@interface test : NSWindow {”中的“测试”是子类吗?
    • 对不起,我没有意识到你的类是 NSWindow 的子类,它是 NSResponder 的子类。
    • 我什至不知道子类是什么。感谢您指出这一点!
    • 这应该是公认的答案,它不需要是 NSWindow 的子类。它确实需要是 NSResponder 的子类。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多