在加载时滚动NSTableView

时间:2013-03-29 04:15:08

标签: objective-c macos cocoa nstableview

我有NSViewController包含基于视图的表格视图。当我初始化视图控制器并将其视图放在screent上时,表视图将滚动到底部。我宁愿让表格视图滚动到顶部。

我知道方法-scrollRowToVisible:,但我无法确定在何处调用它,以便首先将表格视图滚动到顶部。我尝试在-loadView的{​​{1}}方法的末尾插入它,但显然它不起作用,因为表视图在那时还没有加载它的行。

将呼叫置于NSViewController方法的最佳位置是什么?或者,是否有一个属性使表视图显示它的第一行而不是最后一行?

2 个答案:

答案 0 :(得分:0)

我认为这是要走的路..

- 一旦表格的所有项目/行都加载/显示在tableview

中,你应该调用scroll

- 某处你会做reloadData,可能是从nib唤醒,这不是一种阻塞函数,它会调用一些UI Delegate函数,比如

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)aTableColumn byItem:(id)item

也许您应该在这里查看最后一项,NSTableViewUIDelegate中可能有一些委托功能,告诉您何时在表中加载/显示一个项目,您可以检查最后一项,这意味着所有表项都已加载,然后可以安全地调用scrollToVisible

答案 1 :(得分:0)

这是一个老问题,但是为了记录,我今天遇到了这个问题:

表视图的NSScrollView开始滚动到底部,很可能是因为滚动视图在上次关闭窗口后恢复其最后滚动位置。

这是User Interface Preservation /状态恢复功能的一部分。

为了避免滚动视图恢复滚动位置(实际上是任何东西),你可以继承NSScrollView并将它们子类化:

class NonPreservingScrollView: NSScrollView {

    override func encodeRestorableState(with coder: NSCoder) {
        // Nothing
    }
    override func restoreState(with coder: NSCoder) {
        // Nothing
    }
}

可能比尝试跟踪何时重新加载数据更加清晰,滚动视图在窗口加载时不会移动...