2016-06-03 6 views
0

Я создаю сгруппированный NSTableView, который загружается просто отлично и со всеми моими объектами так, как я хочу.NSTableView unhideRowsAtIndexes crashes

Я также создал возможность свернуть целые разделы группы (строки между строками группы) и я использую 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 

Есть ли можно исправить или это рамочная проблема?

КОД: http://pastebin.com/esMH1LBF

+1

Это, безусловно, ошибка в коде.Покажите код и покажите текст исключения, связанный с этой stacktrace (что, вероятно, что-то похожее на строку «исключение вне диапазона»). – Droppy

+0

http://pastebin.com/esMH1LBF мой тестовый код, не обращайте внимания на организацию, это всего лишь тестовый файл – Rageofflames

+0

Что-то случилось с Droppy? – Rageofflames

ответ

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, я просто не уверен.

О, хорошо. Я думал, что должен опубликовать ответ, так что другие люди, борющиеся с этой проблемой, знают об ошибке. Удачи и безопасных поездок, мой землянин.

+0

Я действительно обошел проблема, создавая мои собственные методы, чтобы скрыть/показать. Это действительно было ошибкой, и ее было довольно просто воспроизвести. Спасибо за ваш ответ! : D – Rageofflames