Cambiar entre múltiples UITableView con VoiceOver hace que se bloquee

Tengo un UIViewController con la siguiente jerarquía de vistas:

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

Ninguna de las UITableViews se muestran simultáneamente: simplemente cambie entre ellas por varios motivos: una es para elementos normales, una se utiliza para search resultados, etc.

Recibo este fallo, de manera consistente, activando VoiceOver , haciendo que aparezca UITableView B, descartándolo y luego navegando por los elementos de accesibilidad en UITableView A.

Aquí está la stack de llamadas:

 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 

El error de locking es:

[UITableTextAccessibilityElement accessibilityContainer] message sent to deallocated instance

Me estoy ejecutando en iOS 8.1.2.

Claramente, esto tiene algo que ver con VoiceOver , o mejor dicho, la forma en que UIAccessibility navega por sus elementos de accesibilidad, tratando de acceder a un object desasignado. He tratado de publicar notifications de accesibilidad como UIAccessibilityScreenChangedNotification y UIAccessibilityLayoutChangedNotification después de ocultar y mostrar UITableView s para permitir que la accessibility sepa que la pantalla ha cambiado, pero que no he tenido suerte.

Mi UITableView s A y C también tienen algunas subvenciones adicionales, que se usan para actualizar / cargar más controles, pero incluso eliminarlos no ayuda.

Actualización: también recibo estas advertencias cuando uso VoiceOver para tocar en un UITextField que es una subvista de la UITableView (a) 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? 

Tuve un problema similar en mi proyecto. Después de algunas horas de debugging encontré cuál fue el problema. Resulta que VoiceOver se estrelló debido a algunas celdas vacías (vacías como sin tags / imágenes / etc.) (Utilizo celdas vacías como separadores de espaciado adicionales alnetworkingedor de la celda seleccionada en una sección específica). Después de eliminar los elementos de accesibilidad en esas celdas, los lockings también desaparecieron … tal vez esto también ayude en su caso.

 - (NSInteger)accessibilityElementCount { return 0; } - (NSArray *)accessibilityElements { return nil; }