NSTableView unhideRowsAtIndexes崩溃

问题描述 投票:0回答:1

我正在创建一个分组的NSTableView,加载得很好,我想要的所有对象。

我还创建了折叠整个组部分(组行之间的行)的可能性,并使用添加到hideRowsAtIndexes:withAnimation:unhideRowsAtIndexes:withAnimation:)的NSTableViewhttps://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

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

代码:http://pastebin.com/esMH1LBF

macos cocoa nstableview appkit
1个回答
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。祝你好运,安全旅行,我的同伴们。

© www.soinside.com 2019 - 2024. All rights reserved.