在启用VoiceOver的情况下运行我的应用时,我遇到了一个奇怪的崩溃。该应用程序有侧边栏界面(如Facebook)。当点击侧栏UITableViewCell
中的UITableView
之一时,我会换出视图控制器(根据点击的单元格创建一个新的控制器并取消分配旧单元格。)
启用VoiceOver时,点击单元格时,有时会崩溃。每次都不会发生这种崩溃(大概是每两次或三次尝试)并且这不是导致崩溃的唯一因素(但在我的测试中,它是触发它的主要因素)。
请注意,此次崩溃仅发生 ,然后启用VoiceOver。
发生崩溃时,我通常会在控制台中获取此行。
*** - [UITableTextAccessibilityElement setAccessibilityLabel:]:发送到解除分配的实例0x1fdaec10的消息
但我也见过
*由于未捕获的异常'NSRangeException'终止应用程序,原因:'* - [__ NSArrayM objectAtIndex:]:索引6超出边界[0 .. 4]' 注意我看到启用了异常断点的
NSRangeException
,它没有指向我的代码中发生错误的位置。
所以我启用了NSZombies并在Instruments中运行了应用程序。我的任何代码都没有触及过对象引用。
我还尝试在调试器外部运行时获取崩溃日志,但不幸的是Xcode无法对它们进行符号化。
Last Exception Backtrace:
0 CoreFoundation 0x2e3c3f46 __exceptionPreprocess + 126
1 libobjc.A.dylib 0x387536aa objc_exception_throw + 34
2 CoreFoundation 0x2e2fa52e - [__ NSArrayM objectAtIndex:] + 226
3 APP-NAME 0x000e3726 0x46000 + 644902
4 UIKit 0x0250462e 0x24c6000 + 255534
5 UIAccessibility 0x35c029f8 - [NSObject(AXPrivCategory)accessibilityElementCount] + 16
6 UIAccessibility 0x35bfe66a _appendChildrenToArrayStartingAtIndexWithChildren + 318
7 UIAccessibility 0x35bfe51e _appendChildrenToArrayStartingAtIndex + 86
8 UIAccessibility 0x35bfe460 _addAXElementsToArrayFromObject + 1580
9 UIAccessibility 0x35bfddfc _appendVendedAXElementsFromUIElements + 156
10 UIAccessibility 0x35bfdbfe _createAXUIElementsFromUIElements + 126
11 UIAccessibility 0x35bfc218 _copyParameterizedAttributeValueCallback + 152
12 AXRuntime 0x3152395c _AXXMIGCopyParameterizedAttributeValue + 168
13 AXRuntime 0x3152084e _XCopyParameterizedAttributeValue + 438
14 AXRuntime 0x31528158 mshMIGPerform + 184
15 CoreFoundation 0x2e38e9da CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION + 30
16 CoreFoundation 0x2e38e976 __CFRunLoopDoSource1 + 342
17 CoreFoundation 0x2e38d14a __CFRunLoopRun + 1394
18 CoreFoundation 0x2e2f7c22 CFRunLoopRunSpecific + 518
19 CoreFoundation 0x2e2f7a06 CFRunLoopRunInMode + 102
20 GraphicsServices 0x32fd627e GSEventRunModal + 134
21 UIKit 0x30b9b044 UIApplicationMain + 1132
22 APP-NAME 0x000509e2 0x46000 + 43490
23 libdyld.dylib 0x38c5bab2 tlv_initializer + 2
崩溃发生在iOS 6和7上。我还尝试从整个应用程序中删除每个辅助功能调用,但应用程序仍在崩溃。
我一直试图弄清楚这一周,并且不觉得我越来越近了。关于从哪里开始的任何想法?
答案 0 :(得分:4)
我有同样的错误。我删除了辅助功能方法以摆脱tis错误。 我们需要覆盖一些辅助功能方法,以支持iOS 6中画外音的阅读顺序
- (id)accessibilityElementAtIndex:(NSInteger)index
{
return [[self accessibleElements] objectAtIndex:index];
}
- (NSInteger)indexOfAccessibilityElement:(id)element
{
return [[self accessibleElements] indexOfObject:element];
}
如果您的代码基于我认为的上述方法崩溃了。尝试删除这些方法并检查。我观察到的一件事是在删除上述方法后,画外音不会按顺序读取元素。它将以其他(随机)顺序读取。
希望这能解决你的崩溃问题。
答案 1 :(得分:3)
我们通过在iOS 6而不是7上调试来找到问题。
在iOS 6中,
AX错误:找不到我的模拟父母,很可能是陈旧的。
出现在控制台中。结合提到的UITableViewCell
错误,我们挖掘了侧边栏中的所有表格代码。
我们发现我们使用可重复使用的UITableViewCells
作为标题视图,这导致了我们看到的僵尸问题。
所以底线,不要将UITableViewCells
用作UITableView
页眉/页脚视图。
答案 2 :(得分:1)
如果您尝试将辅助功能手动聚焦到UITableViewCell而不是单元格内的特定项目,则可能会导致此崩溃。如果您的要求是将tableCell作为一个整体视为可访问性元素,那么除了为单元格指定可访问性标签和特征之外,不要为单元格设置isAccessibilityElement = YES
。如果isAccessibilityElement = YES
那么iOS将不会尝试调用导致崩溃的[UITableTextAccessibilityElement setAccessibilityLabel:]
方法,因为它知道tableCell本身是一个可访问性元素,并且不会尝试检查单元格内部的内容。