【问题标题】:cocoa NSScrollView not pass scrollWheel event to next responder可可 NSScrollView 不将 scrollWheel 事件传递给下一个响应者
【发布时间】:2019-11-25 09:34:40
【问题描述】:

我的问题是,我不知道为什么 NSScrollView 没有将 scrollWheel 事件传递给下一个响应者。

我必须手动添加代码

class MyScrollView: NSScrollView {
    override func scrollWheel(with event: NSEvent) {
        super.scrollWheel(with: event)

        // do something

        // If you don't use these codes, the next responder will not receive the event.
        if let responder = self.nextResponder {
            responder.scrollWheel(with: event)
        }
    }
}

现在,我知道如何解决这个问题,但我不知道为什么会出现这个问题。

有人知道这种情况的官方信息吗?

【问题讨论】:

  • 响应链表示只有响应链中的第一个对象处理动作(并不意味着响应链中的所有对象都处理动作)。你的代码是正确的。我会使用你的方法或 NSApp.sendAction: 因为你的下一个响应者可能不知道滚轮。也不要忘记你不应该覆盖滚动视图developer.apple.com/library/archive/releasenotes/AppKit/…
  • @MarekH 下一个响应者知道scrollWheel(with:),它是NSResponder 的一个方法。 “默认实现只是将此消息传递给下一个响应者。”
  • 你想完成什么?
  • @Willeke 好吧,我创建了一个自定义视图并添加了一个集合视图,其结构类似于(自定义视图(NSView))>(滚动视图)>(剪辑视图)>(集合视图)。我希望我的自定义视图类可以接收到 scrollWheel 事件。但事件总是停止到(滚动视图)
  • 所以,我重写了 scrollWheel 函数来满足我的需求,因为下一个响应者是 NSView。

标签: swift macos cocoa appkit swift5


【解决方案1】:

正如 Marek H 所指出的,如果一个对象处理了事件,那么它通常会消耗该事件并且不会将其传递给响应者链。在这种情况下,如果scrollView滚动,那么它的superView肯定不应该对scroll事件做任何事情。

其次,覆盖 scrollWheel(with) 将关闭响应式滚动。

答案:您真正想要做的是在您的 (Custom View(NSView)) 类中覆盖 func wantsForwardedScrollEvents(for axis: NSEvent.GestureAxis) -> Boolhttps://developer.apple.com/documentation/appkit/nsresponder/1534209-wantsforwardedscrollevents

NSScrollView 将尊重这一点,并在不使用它们来实际滚动或橡皮筋时转发 scrollWheel 事件。此外,它还兼容响应式滚动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    相关资源
    最近更新 更多