【发布时间】:2011-01-19 01:35:35
【问题描述】:
如何获取 NSOutlineView 可见行的索引? 我需要知道哪个级别和哪些行是可见的。
[编辑] 我真正在寻找的是一个相当于 CocoaTouch/UITableView 的 NSOutlineView - (NSArray *)indexPathsForVisibleRows
【问题讨论】:
标签: objective-c cocoa macos nsoutlineview
如何获取 NSOutlineView 可见行的索引? 我需要知道哪个级别和哪些行是可见的。
[编辑] 我真正在寻找的是一个相当于 CocoaTouch/UITableView 的 NSOutlineView - (NSArray *)indexPathsForVisibleRows
【问题讨论】:
标签: objective-c cocoa macos nsoutlineview
您可以执行以下操作:
NSScrollView* scrollView = [self.tableView enclosingScrollView];
CGRect visibleRect = scrollView.contentView.visibleRect;
NSRange range = [self.tableView rowsInRect:visibleRect];
在范围内,您将获得作为第一个可见单元格的位置,在长度内显示单元格的数量,以便您知道可见单元格的索引。
【讨论】:
-visibleRect)以及 OP 询问大纲视图(树)与表格(列表)的事实......
NSOutlineView 是 NSTableView 子类。因此-rowsInRect: 可以与-visibleRect 组合(来自NSView)。使用-levelForRow: 确定级别。
【讨论】:
我更改了我的数据源以返回一个 NSIndexPath 用于 outlineView:child:ofItem:。 这样我可以使用 [outlineview rowAtPoint:point] (和类似的)来获取 NSIndexPath。
此更改要求我创建一组这些 indexPath,以便在我不需要它们之前它们不会被释放。此外,通常需要模型对象的所有其他代码现在都需要从索引路径中查找模型对象。就我而言,这是有效的。
【讨论】:
在 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(通常这意味着它是可见的) )."可见行始终可用。但是,有些行可能已准备好显示或已离开表格并且可以在不显示的情况下使用,因此我们可以在只需要可见的情况下获取它们。