NSScrollView 中的 NSTextView 在滚动时不合作

NSTextView inside NSScrollView not co-operating while scrolling

我有一个以 NSTextView 作为单元格的 TableView。 这是我在 scrollView 中有 scrollView 的情况。现在,当我滚动 textView 的内容时,当 textview 的内容到达末尾时,我希望父 scrollView(tableView)继续滚动。但默认情况下不会发生这种情况。相反,当鼠标指针位于 textView 内时,父级根本不滚动。

I want to achieve something like in this example.

这是我的解决方案:

public class DisableableScrollView: NSScrollView {

public override func scrollWheel(with event: NSEvent) {

    // Check if the text field is empty
    if (self.subviews[0].subviews[2] as! NSTextView).textStorage?.length == 0 {
        nextResponder?.scrollWheel(with: event)
    }
    // Bottom
    else if self.verticalScroller?.floatValue == 1.00  {
        if event.deltaY < 0 {
            nextResponder?.scrollWheel(with: event)
        }
        else {
            super.scrollWheel(with: event)
        }
    }
    // Top
    else if self.verticalScroller?.floatValue == 0.00  {
        if event.deltaY > 0 {
            nextResponder?.scrollWheel(with: event)
        }
        else {
            super.scrollWheel(with: event)
        }
    }

    else {
        super.scrollWheel(with: event)
    }
}

但是有一个问题:当我在一个文本字段上滚动时,其他文本字段正在滚动。click here to see

这里的问题出在魔术鼠标上。如果我使用普通的 mighty 鼠标,一切正常。但是使用魔术鼠标,当我在滚动后抬起手指时,它会继续滚动(动量滚动)但有时会滚动错误的 textView 实例。根据 Apple Documentation,滚轮事件有两个属性:phase 和 momentumPhase。在我抬起手指后使用魔术鼠标,阶段变为结束,动量阶段变为开始。

有人知道这个问题的标准解决方案吗? 或者,如果我的代码是正确的,可能哪里出了问题?

来自Apple Guidelines

Don’t place a scroll view inside of another scroll view. Doing so creates an unpredictable interface that’s difficult to control.

In general, display one scroll view at a time. People often make large swipe gestures when scrolling, and it can be hard to avoid interacting with a neighboring scroll view on the same screen. If you need to put two scroll views on one screen, consider allowing them to scroll in different directions so one gesture is less likely to affect both views. For example, when an iPhone is in portrait orientation, the Stocks app shows stock quotes that scroll vertically above company-specific information that scrolls horizontally.

你应该重新考虑你的设计。

我找到了问题的解决方案,因此想到分享它。

此特定方法 wantsForwardedScrollEvents(for:) 可用于在内容到达末尾时将滚动事件向上转发到响应程序链。我们只需要在必要时覆盖此方法和 return true