【问题标题】:How can you get indexes of visible rows for an NSOutlineView?如何获取 NSOutlineView 可见行的索引?
【发布时间】:2011-01-19 01:35:35
【问题描述】:

如何获取 NSOutlineView 可见行的索引? 我需要知道哪个级别和哪些行是可见的。

[编辑] 我真正在寻找的是一个相当于 CocoaTouch/UITableView 的 NSOutlineView - (NSArray *)indexPathsForVisibleRows

【问题讨论】:

    标签: objective-c cocoa macos nsoutlineview


    【解决方案1】:

    您可以执行以下操作:

    NSScrollView* scrollView = [self.tableView enclosingScrollView];
    
    CGRect visibleRect = scrollView.contentView.visibleRect;
    
    NSRange range = [self.tableView rowsInRect:visibleRect];
    

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

    【讨论】:

    • 很好的答案!然后遍历 [self.tableView itemAtRow:range.location]
    • 不知道这与我将近两年半前发布的答案有何不同,除了滚动视图的不必要参与(您可以直接询问视图以获取其-visibleRect)以及 OP 询问大纲视图(树)与表格(列表)的事实......
    【解决方案2】:

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

    【讨论】:

    • 似乎您必须迭代模型才能计算到行号。我真的不想要线性时间......除非我错过了什么?
    • 我不确定你的意思。您可以通过 itemForRow: 等将行转换为真实对象。
    • 对不起...我的问题不够详细。我实际上希望能够获得可见行的树坐标。例如,在我的例子中,树有两个级别,所以它有两个叶子节点的索引。
    • 啊。我想我明白你的意思。我不相信有一种直接的方法可以从项目中获取 NSIndexPath 而不通过递归地询问 -parentOfItem: 的大纲视图来构建它:直到它以 nil 响应。对于屏幕上的几行并且只有两层深,老实说,我不相信您面临性能问题。尝试然后测量。 :-)
    • @Cal,仅当您的行具有动态高度时,才会迭代模型。否则,使用一个简单的公式在幕后解决可见矩形中的行。
    【解决方案3】:

    我更改了我的数据源以返回一个 NSIndexPath 用于 outlineView:child:ofItem:。 这样我可以使用 [outlineview rowAtPoint:point] (和类似的)来获取 NSIndexPath。

    此更改要求我创建一组这些 indexPath,以便在我不需要它们之前它们不会被释放。此外,通常需要模型对象的所有其他代码现在都需要从索引路径中查找模型对象。就我而言,这是有效的。

    【讨论】:

    • 仍然希望有一个 indexPathsForVisibleRows 等价物。
    【解决方案4】:

    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(通常这意味着它是可见的) )."可见行始终可用。但是,有些行可能已准备好显示或已离开表格并且可以在不显示的情况下使用,因此我们可以在只需要可见的情况下获取它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2015-09-11
    • 2011-01-01
    • 1970-01-01
    相关资源
    最近更新 更多