【问题标题】:Scroll NSTableView on load加载时滚动 NSTableView
【发布时间】:2017-09-15 13:53:09
【问题描述】:

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

我知道-scrollRowToVisible: 方法,但我不知道在哪里调用它才能使表格视图首先出现滚动到顶部。我尝试将它插入到 NSViewController-loadView 方法的末尾,但显然它不起作用,因为此时表格视图甚至还没有加载它的行。

调用-scrollRowToVisible: 方法的最佳位置是什么?或者,是否有一个属性可以让表格视图显示它的第一行而不是最后一行?

【问题讨论】:

    标签: objective-c macos cocoa nstableview


    【解决方案1】:

    我认为这是要走的路..

    --一旦表格的所有项目/行都加载/显示在 tableview 中,您应该调用 scroll

    -- 在某个地方你会做 reloadData,可能是在从 nib 唤醒的时候,这不是一种阻塞函数,它会调用一些 UI Delegate 函数,比如

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

    也许你应该在这里检查最后一项,NSTableViewUIDelegate 中可能有一些 Delegate 函数,它告诉你一个 Item 何时加载/显示在 Table 中,你可以在那里检查最后一项,这意味着所有表格项都已加载,然后可以安全地调用 scrollToVisible

    【讨论】:

    • 感谢工作。我最终把电话打到了-tableView:rowViewForRow:。我认为将它放在任何委托方法中都会导致崩溃,因为单元格尚未完全布局,但事实并非如此。再次感谢。
    • 没有“NSTableViewUIDelegate”这样的东西,你链接到UITableViewDelegate,这是错误的平台。
    【解决方案2】:

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

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

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

    为避免滚动视图恢复滚动位置(实际上,任何东西),您可以将NSScrollView 子类化并将这些子类化:

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

    也许比在重新加载数据完成时尝试跟踪更干净,并且在窗口加载时滚动视图不会移动......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多