我正在创建一个分组的NSTableView
,加载得很好,我想要的所有对象。
我还创建了折叠整个组部分(组行之间的行)的可能性,并使用添加到hideRowsAtIndexes:withAnimation:
(unhideRowsAtIndexes:withAnimation:
)的NSTableView
和https://developer.apple.com/library/mac/releasenotes/AppKit/RN-AppKit/#10_11TableView。
隐藏总是似乎工作,但一些行无法隐藏崩溃。最后一行隐藏和取消隐藏就好了,前一个总是在取消隐藏时崩溃。只有当我有更多行然后才能显示时,才会发生此行为。
Xcode给出的控制台崩溃日志:
0 CoreFoundation 0x00007fff95d034f2 __exceptionPreprocess + 178
1 libobjc.A.dylib 0x00007fff9b506f7e objc_exception_throw + 48
2 CoreFoundation 0x00007fff95c1a7c5 -[__NSArrayM objectAtIndex:] + 245
3 AppKit 0x00007fff94e0496c -[NSTableRowData _updateVisibleViewsBasedOnUpdateItems] + 2701
4 AppKit 0x00007fff94e03dc5 -[NSTableRowData _updateVisibleViewsBasedOnUpdateItemsAnimated] + 241
5 AppKit 0x00007fff94d17d3f -[NSTableRowData _doWorkAfterEndUpdates] + 82
6 AppKit 0x00007fff94d1db49 -[NSTableView _doUpdatedWorkWithHandler:] + 251
7 AppKit 0x00007fff953209bc -[NSTableView hideRowsAtIndexes:withAnimation:] + 249
8 Testing NSTableView Collapse 0x0000000100004dfd -[AppDelegate collapse:] + 285
9 libsystem_trace.dylib 0x00007fff945ac07a _os_activity_initiate + 75
10 AppKit 0x00007fff94e75dbd -[NSApplication sendAction:to:from:] + 460
11 AppKit 0x00007fff94e87f12 -[NSControl sendAction:to:] + 86
12 AppKit 0x00007fff94e87e3c __26-[NSCell _sendActionFrom:]_block_invoke + 131
13 libsystem_trace.dylib 0x00007fff945ac07a _os_activity_initiate + 75
14 AppKit 0x00007fff94e87d99 -[NSCell _sendActionFrom:] + 144
15 libsystem_trace.dylib 0x00007fff945ac07a _os_activity_initiate + 75
16 AppKit 0x00007fff94e863be -[NSCell trackMouse:inRect:ofView:untilMouseUp:] + 2693
17 AppKit 0x00007fff94ecef04 -[NSButtonCell trackMouse:inRect:ofView:untilMouseUp:] + 744
18 AppKit 0x00007fff94e84ae8 -[NSControl mouseDown:] + 669
19 AppKit 0x00007fff953d93c9 -[NSWindow _handleMouseDownEvent:isDelayedEvent:] + 6322
20 AppKit 0x00007fff953da3ad -[NSWindow _reallySendEvent:isDelayedEvent:] + 212
21 AppKit 0x00007fff94e19539 -[NSWindow sendEvent:] + 517
22 AppKit 0x00007fff94d99a38 -[NSApplication sendEvent:] + 2540
23 AppKit 0x00007fff94c00df2 -[NSApplication run] + 796
24 AppKit 0x00007fff94bca368 NSApplicationMain + 1176
25 Testing NSTableView Collapse 0x0000000100001352 main + 34
26 libdyld.dylib 0x00007fff89d675ad start + 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。祝你好运,安全旅行,我的同伴们。