Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 自定义NSScrollView不';t滚动NSTableHeaderView_Objective C_Cocoa_Nstableview_Nsscrollview - Fatal编程技术网

Objective c 自定义NSScrollView不';t滚动NSTableHeaderView

Objective c 自定义NSScrollView不';t滚动NSTableHeaderView,objective-c,cocoa,nstableview,nsscrollview,Objective C,Cocoa,Nstableview,Nsscrollview,我在自定义的NSScrollView子类中嵌入了一个NSTableView,其中我有时会以编程方式进行滚动,如下所示: [[self contentView] scrollToPoint:newOffset]; [self reflectScrolledClipView:[self contentView]]; NSTableHeader *header = [[self documentView] headerView]; [header setBoundsOrigin:NSMakePoin

我在自定义的
NSScrollView
子类中嵌入了一个
NSTableView
,其中我有时会以编程方式进行滚动,如下所示:

[[self contentView] scrollToPoint:newOffset];
[self reflectScrolledClipView:[self contentView]];
NSTableHeader *header = [[self documentView] headerView];
[header setBoundsOrigin:NSMakePoint(newOffset.x,[header bounds].origin.y)];
执行此操作时,
NSTableView
滚动良好,但其关联的
NSTableHeaderView
不会随之移动。但是,如果我正常使用鼠标滚动
NSScrollView
,它们会像应该的那样一起移动


我想我可能只是在某个地方漏掉了一行,让
NSTableHeaderView
知道它也应该滚动,但我不知道那是什么。有人能帮忙吗?

好吧,我不知道当你用鼠标滚动一个包含
NSTableHeaderView
NSScrollView时,引擎盖下到底发生了什么样的黑魔法,但它看起来像是在某个地方内部处理的。为了避免这种情况,我现在只以编程方式滚动
NSTableView
(通过覆盖处理用户输入的函数),然后我自己滚动
NSTableHeaderView
,如下所示:

[[self contentView] scrollToPoint:newOffset];
[self reflectScrolledClipView:[self contentView]];
NSTableHeader *header = [[self documentView] headerView];
[header setBoundsOrigin:NSMakePoint(newOffset.x,[header bounds].origin.y)];

我在使用Swift 5/MacOS 14的基于cell的NSTableView上遇到了同样的问题

包含NSTableView的NSScrollView同时拥有NSTableView的contentView和headerView(以及我不使用的cornerView),并且通常负责协调它们的滚动

  • 当使用鼠标滚动时,NSScrollView内部魔术手柄可正确控制标题视图的滚动
  • 使用scroll(to:)+reflectScrolledClipView以编程方式滚动NSClipView时,NSScrollView无法滚动headerView
我使用此协议也是为了以编程方式滚动headerView,这允许我使用此协议以编程方式滚动:

extension NSTableView : ScrollingProtocol {

    func getScrollView() -> NSScrollView? {
        return enclosingScrollView
    }

    func getVisibleOrigin() -> NSPoint? {
        return enclosingScrollView?.documentVisibleRect.origin
    }

    func scrollToOrigin(_ targetOrigin: NSPoint) {
        guard let currentOrigin = getVisibleOrigin(),
            let scrollView = enclosingScrollView
            else { return }

        if (!NSEqualPoints(targetOrigin, currentOrigin)) {
            let clipView = scrollView.contentView
            clipView.scroll(to: targetOrigin)

            // Workaround because NSClipView.scroll(to:) does not scroll
            // the headerView of NSTableView
            if let headerView = headerView {
                let x = targetOrigin.x
                let y = headerView.bounds.origin.y
                if let headerClipView = headerView.superview as? NSClipView {
                    headerClipView.scroll(to: NSMakePoint(x, y))
                }
            }
            scrollView.reflectScrolledClipView(clipView)
        }
    }
}

您是否尝试过使用
-documentView
而不是
-contentView
。它不起作用P不过,老实说,用
-documentView
而不是
-contentView
没有多大意义
-documentView
返回
NSTableView
,而
-contentView
返回
NSClipView
。在这种情况下,我非常确定我需要
NSClipView
。黑魔法在于NSScrollView检查文档视图中的“headerView”方法/属性,如果找到,就会这样处理。在我能找到的任何地方都没有记录,除了以下邮件列表: