【问题标题】:Handling mouse events on NSButton created in Interface Builder处理在 Interface Builder 中创建的 NSButton 上的鼠标事件
【发布时间】:2011-07-13 11:11:57
【问题描述】:

我有一个课堂项目,包括编写类似 swype 的程序。我必须用java来做,你可以看看它(用代码)here。今年夏天,我想把它移植到 ObjC/Cocoa 中,然后改进它。我打算将 NSButtons 用于键盘按键,例如 Interface Builder 提出的“渐变按钮”。

所以,我研究了如何处理鼠标事件(我需要鼠标按下、输入、退出和释放)。对于某些对象,看起来您必须使用委托,但对于 NSButton,看起来像 -mouseDown 和相关的方法都在对象本身中。

我的问题是,如何覆盖接口构建器对象中的方法?我尝试创建一个 NSButton 的子类,并将我的按钮类设置为这个子类,但没有结果。也许尝试覆盖这些方法根本不是正确的方法,我对每一个建议都持开放态度,即使它与事件处理无关。如果它是相关的,我正在运行 OS X 10.6,XCode 4。

感谢您的宝贵时间!

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    很大程度上取决于您为什么需要所有各种事件。 NSButton 是一个控件,因此其工作方式与标准 NSView 不同。

    如果您最需要弄清楚按钮何时被按下,您可以通过在 IB 中分配一个动作来做到这一点。这是通过在表单的控制器类中创建一个 void 方法来完成的:

    - (IBAction) myMouseAction:(id)sender
    

    然后让它根据收到的点击执行您需要的操作。然后在 IB 中,您可以通过控制单击按钮并拖动到您的控制器类(可能是所有者)并在出现提示时选择您的新方法来将此操作连接到按钮。

    如果您需要细粒度的控制,您应该考虑创建自己的 NSView 子类并自己处理鼠标操作,因为尝试覆盖控件是一件相当复杂的事情。 OS X 控件的架构旨在实现极致性能,但它们现在有点不合时宜,通常不值得您自己创建。

    另一件事是 mouseEntered:、mouseMoved: 和 mouseExited: 事件用于处理鼠标按钮向上时的鼠标移动。

    您需要注意:mouseDown:、mouseUp: 和 mouseDragged: 以便在按住鼠标按钮时处理事件。

    【讨论】:

    • 在 swype 键盘上,您可以从一个键滑到另一个键以“输入”您的单词。因为我不是为触摸屏做的,所以当用户按下鼠标时“滑动”开始,当它被释放时结束。我需要跟踪用户悬停在哪些键上(输入键),以及他停留在该键上的时间(退出键)。我仍然不是很熟悉 Cocoa 类层次结构。如果我理解正确,鼠标事件是在 nsview 级别处理的,而 nsbutton 是它的子类,对吗?
    • 好的,我明白了。如果您需要在按住按钮的情况下从一个滑动到下一个,则不需要 NSButton。您将要使用 NSView。单个控制器从 NSView 接收更新信息以进行进入/退出可能就足够了。
    • 一点更新。我创建了一个 NSView 的子类,在其中我覆盖了 mouseUp、Down、Entered 等事件。我对它们所做的只是调用 NSLog,以检查它们是否在应该调用的时候被调用。问题是,Up/Down/Dragged 鼠标事件按预期工作,但 Entered/Exited/Moved 事件似乎永远不会被触发。有什么想法吗?
    • 使用这个主题 (stackoverflow.com/questions/4639379/how-to-use-nstrackingarea),我设法在主视图上跟踪鼠标进入/退出事件,但不是在按钮上。这就像 NSButton 阻止跟踪这些事件
    • 好吧,终于。只需将 NSTrackingInVisibleRect 添加到选项中,现在它就可以工作了。感谢您为我指出正确的方向!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多