2015-01-05 3 views
3

У меня есть UIViewController со следующей иерархии представлений:переключение между несколькими UITableView с VoiceOver вызывает сбой

UIView (root of UIViewController) 
     |__________ 
     |   | 
UITableView(A) UIView (overlay view) 
      ____|_______ 
      |   | 
     UITableView(B) UITableView(C) 

Ни один из UITableViews не показаны одновременно - я просто переключаться между ними по разным причинам: один для нормальных предметов , один используется для поиска результатов и т.д.

Я получаю эту аварию, несколько последовательно, путем включения VoiceOver, вызывая UITableView B появляться, отвергая его, а затем навигации по пунктам доступности в UITableView А.

Вот стек вызовов:

Thread : Crashed: com.apple.main-thread 
0 libobjc.A.dylib    0x00000001954a7bd0 objc_msgSend + 16 
1 UIKit       0x000000018317ea68 -[UITableViewCellAccessibility _accessibilityReuseChildren:forMockParent:] + 496 
2 UIKit       0x000000018318f28c -[UITableViewCellAccessibilityElement tableViewCell] + 260 
3 UIKit       0x000000018318fcac -[UITableViewCellAccessibilityElement isAccessibilityElement] + 24 
4 UIAccessibility    0x0000000191c2c030 _appendChildrenToArrayStartingAtIndexWithChildren + 352 
5 UIAccessibility    0x0000000191c2bd04 _addAXElementsToArrayFromObject + 1620 
6 UIAccessibility    0x0000000191c2b680 _appendVendedAXElementsFromUIElements + 288 
7 UIAccessibility    0x0000000191c2b53c _createAXUIElementsFromUIElements + 160 
8 UIAccessibility    0x0000000191c2a3cc _copyParameterizedAttributeValueCallback + 208 
9 AXRuntime      0x000000018a5f4a30 _AXXMIGCopyParameterizedAttributeValue + 256 
10 AXRuntime      0x000000018a5f0850 _XCopyParameterizedAttributeValue + 412 
11 AXRuntime      0x000000018a5fbbc0 mshMIGPerform + 272 
12 CoreFoundation     0x0000000184cf6200 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 56 
13 CoreFoundation     0x0000000184cf6160 __CFRunLoopDoSource1 + 436 
14 CoreFoundation     0x0000000184cf40e0 __CFRunLoopRun + 1640 
15 CoreFoundation     0x0000000184c210a4 CFRunLoopRunSpecific + 396 
16 GraphicsServices    0x000000018ddc35a4 GSEventRunModal + 168 
17 UIKit       0x00000001895563c0 UIApplicationMain + 1488 
18 Stack Exchange     0x000000010018dbe4 main (main.m:16) 
19 libdyld.dylib     0x0000000195b02a08 start + 4 

Ошибка Грохот является:

[UITableTextAccessibilityElement accessibilityContainer] message sent to deallocated instance

Я бегу на iOS 8.1.2.

Очевидно, что это связано с VoiceOver, или, точнее, способ, которым UIAccessibility осуществляет навигацию через свои элементы доступности, пытается получить доступ к освобожденному объекту. Я пробовал уведомления о доступности для проводки, такие как UIAccessibilityScreenChangedNotification и UIAccessibilityLayoutChangedNotification после скрытия и отображения UITableView s, чтобы сообщить accessibility, что экран изменился, но не повезло.

Обновление: Я также получаю эти предупреждения при использовании VoiceOver нажать на UITextField, который является подвид из UITableView (а) headerView собственности:

**** Accessibility: Could not find a valid index for <SESearchBar: 0x16a03150; frame = (0 0; 320 44); text = ''; layer = <CALayer: 0x16a02fc0>> in -[UITableView indexOfAccessibilityElement:] 
|warning| **** Accessibility: Could not find where <SESearchBar: 0x16a03150; frame = (0 0; 320 44); text = ''; layer = <CALayer: 0x16a02fc0>> starts. Was its parent [<UITableView: 0x16208a00; frame = (0 0; 320 504); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x16b4a8c0>; layer = <CALayer: 0x16b49750>; contentOffset: {0, 0}; contentSize: {320, 1800}>] set correctly or did it disappear? 
+0

Вы видите сообщения консоли, которые описывают что-либо об ошибке при ее сбое? Если вы установили зомби в свою схему, вы получите сообщение об ошибке с целью objc_msgSend? –

+0

@PhillipMills Я добавил некоторые предупреждения консоли в вопрос. И у меня есть зомби, и это лучшее, что у нас есть. –

+0

Используете ли вы стандартную реализацию VoiceOver для ячеек tableView? Например, присвоение класса accessibilityLabel в самой ячейке? Или что-то более обычное, если говорить о группировке подкатегорий ячейки? Попробуйте это - после того, как экран изменится, вызовите '[self.tableView reloadData]', а затем опубликуйте уведомление о том, что экран/макет изменился. Если вы можете опубликовать какой-то код, который вы используете, это будет действительно полезно. –

ответ

1

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

- (NSInteger)accessibilityElementCount { 
    return 0; 
} 

- (NSArray *)accessibilityElements { 
    return nil; 
} 
Смежные вопросы