NSTableView unhideRowsAtIndexes崩溃

时间:2016-06-03 14:26:08

标签: macos cocoa nstableview appkit

我正在创建一个分组NSTableView,它可以按照我想要的方式加载。

我还创建了折叠整个组部分(组行之间的行)的可能性,并使用添加到hideRowsAtIndexes:withAnimation:的{​​{1}}和unhideRowsAtIndexes:withAnimation:https://developer.apple.com/library/mac/releasenotes/AppKit/RN-AppKit/#10_11TableView )。

隐藏似乎总能正常工作,但对于某些行而言却是无法解决的。最后一行隐藏和取消隐藏就好了,前一个总是在取消隐藏时崩溃。只有当我有更多行可以显示时才会发生此行为。

Xcode提供的控制台崩溃日志:

NSTableView

是否存在可能的修复或这是一个框架问题?

CODE: http://pastebin.com/esMH1LBF

1 个答案:

答案 0 :(得分:1)

由于这个问题一直困扰着我,我做了一些挖掘,你知道什么?你是对的!这是一个AppKit错误。以下是AppKit 10.13 Release Notes的一些细节:

  

<强> NSTableView的

     

在使用标准行高时,使用方法-hideRowsAtIndexes:withAnimation:隐藏行在macOS 10.13之前无法正常工作。这已针对macOS 10.13上的所有应用程序进行了修复。如果您的目标是较旧的操作系统,建议使用“变量行高”,方法是实现-tableView:heightOfRow:并返回所需的行高;这将解决隐藏行索引的错误。

     

使用方法-unhideRowsAtIndexes取消隐藏行:withAnimation:在使用非连续行集时,在macOS 10.13之前无法正常工作。这已针对macOS 10.13上的所有应用程序进行了修复。

您会在第二段中注意到您的问题已被提及。

如果您正在开发早期版本的macOS,则可以执行以下操作:

func unhideRows(at indexes: IndexSet, animation: NSTableView.AnimationOptions = []) {
    if #available(macOS 10.13, *) {
        outlineView.unhideRows(
            at: indexes,
            withAnimation: animation
        )
    } else {
        for range in indexes.rangeView {
            outlineView.unhideRows(
                at: IndexSet(integersIn: range),
                withAnimation: animation
            )
        }
    }
}

我希望我可以说这会在100%的时间内解决问题,但似乎并非如此。每隔一段时间,我似乎仍然遇到这样的界限:

  

- [__ NSArrayM objectAtIndex:]:索引11超出界限[0 ... 10]

这可能是由于其他因素造成的,例如我的半复杂过滤代码,但由于我实际上无法看到Apple在其NSTableView方法中所做的事情,如_updateVisibleViewsBasedOnUpdateItems,我只是不确定。

哦,好吧。我以为我应该发布一个答案,以便其他人在这个问题上挣扎,知道这个bug。祝你好运,安全旅行,我的同伴们。