我正在创建一个分组NSTableView
,它可以按照我想要的方式加载。
我还创建了折叠整个组部分(组行之间的行)的可能性,并使用添加到hideRowsAtIndexes:withAnimation:
的{{1}}和unhideRowsAtIndexes:withAnimation:
(https://developer.apple.com/library/mac/releasenotes/AppKit/RN-AppKit/#10_11TableView )。
隐藏似乎总能正常工作,但对于某些行而言却是无法解决的。最后一行隐藏和取消隐藏就好了,前一个总是在取消隐藏时崩溃。只有当我有更多行可以显示时才会发生此行为。
Xcode提供的控制台崩溃日志:
NSTableView
是否存在可能的修复或这是一个框架问题?
答案 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。祝你好运,安全旅行,我的同伴们。