【问题标题】:How do I handle a mousedown event inside a window in Cocoa如何在 Cocoa 的窗口中处理 mousedown 事件
【发布时间】:2011-03-30 21:04:28
【问题描述】:

如何在 Cocoa 的窗口中处理 mousedown 事件?

我的代码:

-(void)mouseDown:(NSEvent *)event {
    NSLog(@"yay");
}    

我在 xcode 4.0.1 中使用 Mac OS10.6。

编辑: 是的,这是在应用程序委托中,但这是我的 .h:

@interface jumperAppDelegate : NSWindow {

我之前在应用程序委托中做过的事情(只是不适用于鼠标事件)。这真的很烦我

【问题讨论】:

  • 除了缺少的前导-(即-(void)mouseDown:),这是正确的。你有什么问题?
  • 它不起作用(对不起,我遗漏了 - 但它在我的代码中)。
  • 您确定要将此代码添加到 NSWindow 实现中吗?也许您将它添加到应用程序委托或类似的东西?
  • 您的应用委托继承自 NSWindow?这是一个非常奇怪的设计选择——应用程序委托是一个控制器,而不是一个视图。

标签: objective-c cocoa events mouseevent


【解决方案1】:

确保您继承自 NSWindow,并符合 <NSWindowDelegate> 协议。像这样:

@interface YourWindow : NSWindow <NSWindowDelegate> {}
@end

那么你应该会收到事件通知。

-(void)mouseDown:(NSEvent *)event {    
}

【讨论】:

  • 其实我不确定是否需要遵守NSWindowDelegate。还是试一试吧。
  • 这仍然不起作用,这很奇怪。我已经继承了 NSWindow,并且我做了 NSWindowDelegate 这没有帮助。不知道怎么回事
  • @Conor:您确定没有某个窗口/视图高于您要为其注册 mouseDown 事件的窗口/视图吗?也许它正在吸收通知。另外,尝试按照 sosborn 所说的去做,即在 acceptsFirstResponder 上返回 YES。
  • 我使用 AppDelegate 和 MainWindow.xib 作为我的窗口。我添加的唯一其他文件是让它全屏显示。我也改成了NSWindow,但是没用。。。不知道怎么办
  • @Conor:那是你的问题。你的委托不应该从 NSWindow 继承。您需要制作一个自定义视图 (afaik) 并将其连接到一个继承自 NSWindow 的新自定义类。
【解决方案2】:

要调用这个方法,调用它的类需要从 NSResponder 继承。窗口和视图都是 NSResponder 的子类。如果您从中调用它的类不是 NSResponder 的子类,则该方法将不会触发。

* 更新 * 还要确保覆盖acceptsFirstResponder 以返回yes。

- (BOOL)acceptsFirstResponder {
   return YES;
}

【讨论】:

    【解决方案3】:

    我不确定,但我听说在您的头文件 (.h) 中,您需要将“NSObject”替换为“NSWindow”。我会测试它,但我现在不在我的电脑前。

    另外,请确保将以下代码放入头文件:

    - (void) mouseDown:(NSEvent*)event;
    

    编辑:我做了一些测试和研究,但我无法让它发挥作用。不过我有两个提示。

    • 使用 '-acceptsFirstMouse 方法。

    • 尝试创建一个 NSEvent:

      NSEvent * someEvent; -(void)mouseDown:(NSEvent*)someEvent;

    这可能行不通,但我明天会有更多信息

    【讨论】:

    • 不需要把它放在头文件中。这是一个通知,因此编译器不需要查看标头声明。
    猜你喜欢
    • 1970-01-01
    • 2014-12-28
    • 2011-08-07
    • 1970-01-01
    • 2023-04-02
    • 2013-12-15
    相关资源
    最近更新 更多