使用VoiceOver在多个UITableView之间切换会导致崩溃

时间:2015-01-05 20:31:56

标签: ios objective-c uitableview voiceover

我有一个UIViewController,其中包含以下视图层次结构:

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

UITableViews没有同时显示 - 我只是因为各种原因在它们之间切换:一个用于普通项目,一个用于搜索结果等。

我通过启用VoiceOver,导致UITableView B出现,解除它,然后浏览UITableView A中的辅助功能项目,从而在某种程度上保持这种崩溃。 / p>

这是调用堆栈:

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之后发布UIAccessibilityLayoutChangedNotificationUITableView等辅助功能通知,让accessibility知道屏幕已更改,但尚未有运气吗

我的UITableView A和C还有一些额外的子视图,用作刷新/加载更多控件,但即使删除它们也无济于事。

更新:使用VoiceOver点击UITextField时,我也收到了这些警告,UITableViewheaderView(a){{1}的子视图property:

**** 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?

1 个答案:

答案 0 :(得分:1)

我的项目中有类似的问题。经过几个小时的调试后,我发现了问题所在。事实证明,VoiceOver由于某些空(没有任何标签/图像/等等的空)表视图单元格而崩溃(我使用空单元格作为特定部分中所选单元格周围的附加间隔分隔符)。在我删除了那些单元格中的辅助功能元素后,崩溃也消失了......也许这对你的情况也有帮助。

- (NSInteger)accessibilityElementCount {
    return 0;
}

- (NSArray *)accessibilityElements {
    return nil;
}