首页 > 解决方案 > 可可 NSScrollView 不将 scrollWheel 事件传递给下一个响应者

问题描述

我的问题是,我不知道为什么 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)
        }
    }
}

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

有没有人有关于这种情况的官方信息?

标签: swiftmacoscocoaappkitswift5

解决方案


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

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

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

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


推荐阅读