如何获取NSOutlineView可见行的索引?

9
你如何获取NSOutlineView可见行的索引? 我需要知道哪个级别和哪些行是可见的。 [编辑] 实际上,我正在寻找与CocoaTouch / UITableView等效的NSOutlineView -(NSArray *)indexPathsForVisibleRows。
4个回答

23

你可以按照以下方式操作:

NSScrollView* scrollView = [self.tableView enclosingScrollView];

CGRect visibleRect = scrollView.contentView.visibleRect;

NSRange range = [self.tableView rowsInRect:visibleRect];

在范围内,您将获得第一个可见单元格作为位置,并且在长度中显示了单元格的数量,以便您可以知道可见单元格的索引。


1
很棒的答案!然后迭代[self.tableView itemAtRow:range.location]。 - stevesliva
1
不确定这与我两年半前发布的答案有何不同,除了滚动视图的不必要参与(您可以直接向视图询问其“-visibleRect”)和OP提出的是关于轮廓视图(树)与表格(列表)的问题。 - Joshua Nozzi

13

NSOutlineViewNSTableView 的子类。因此,-rowsInRect: 可以与 -visibleRect(来自 NSView)组合使用。使用 -levelForRow: 来确定级别。


似乎你需要迭代模型来计算行数。我不想要线性时间...除非我漏掉了什么? - Cal
我不确定你的意思。你可以通过itemForRow:等方法将行转换为它们的真实对象。 - Joshua Nozzi
抱歉...我的问题不够详细。实际上,我想要能够获取可见行的树坐标。例如,在我的情况下,该树有两个级别,因此叶节点将有两个索引。 - Cal
1
啊,我明白你的意思了。我不认为有一种直接的方法可以从一个项目中获取NSIndexPath,而不是通过递归地询问大纲视图的-parentOfItem:来构建它,直到它响应为nil。然而,对于屏幕上只有几行且仅有两个级别的情况,我真的不认为你会面临性能问题。试试看,再测量一下。 :-) - Joshua Nozzi
这对于 NSTableView 和异步加载图像也非常有帮助。 - Keith Smiley
1
@Cal,仅当您的行具有动态高度时,模型才会进行迭代。否则,使用简单的公式在幕后解决获取可见矩形中的行问题。 - Radu Simionescu

0
在 Swift 3 中:
let rows = IndexSet(integersIn: 0..<outlineView.numberOfRows)
let rowViews = rows.flatMap { outlineView.rowView(atRow: $0, makeIfNecessary: false) as? RowView }

for rowView in rowViews 
    //iterate over rows
}

.rowView的文档中可以得知:"通常情况下,如果您只想在视图可用时(通常意味着它是可见的)更新视图上的属性,则应将makeIfNecessary设置为false。"可见行始终可用。但是,有些行可能已准备好显示或已离开表格并可用而未被显示,因此我们可以在仅需要可见行时获取它们。 - João Colaço
OP 要求“可见”行。 - Alan

0

我将我的数据源更改为返回一个NSIndexPath,以便在outlineView:child:ofItem:中使用[outlineview rowAtPoint:point](和类似的方法)来获取NSIndexPath。

这个更改要求我创建一组这些indexPaths,以便在不需要它们时它们不会被释放。此外,所有通常期望模型对象的其他代码现在都需要从索引路径中查找模型对象。在我的情况下,这是有效的。


1
仍然希望有一个等价的indexPathsForVisibleRows。 - Cal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接