当VoiceOver遇到UIPickerView作为UITableViewCell contentView的子视图时,如何避免崩溃?

时间:2010-09-11 17:16:59

标签: iphone cocoa-touch uikit uitableview uipickerview

在我的应用程序中,我有一个UIPickerView作为表格单元格的contentView的子视图。我在表视图中禁用滚动,并且在正常情况下安排正常。但是,我发现当VoiceOver(或辅助功能检查器)打开时,一旦选择器到达焦点,应用程序就会崩溃。

错误是:

-[UITableViewCellAccessibilityElement numberOfComponents]: unrecognized selector sent to instance 0xc15dc70

似乎正在发生的事情是,VoiceOver正在向UITickerViewAccessibilityElement发送可能用于UIPickerView(或其自己的UIAccessibilityElement?)的消息。

当我使用以下类别修补UIAccessibilityElement时......

@implementation UIAccessibilityElement (GMPatches)

- (NSInteger)numberOfComponents {
  return 0;
}

@end

...我消除了崩溃 - 但现在,毫不奇怪,VoiceOver无法更改UIPickerView值。

如果我在此上下文中将其更改为真值...

@implementation UIAccessibilityElement (GMPatches)

- (NSInteger)numberOfComponents {
  return 1;
}

@end

...然后VoiceOver发送下一个错误的消息,再次降低所有内容:

-[UITableViewCellAccessibilityElement selectedRowInComponent:]: unrecognized selector sent to instance 0x1e97b0

我很确定这是一个iOS错误。

我尝试在选择器,表格单元格和表格单元格的内容视图中设置isAccessibilityElement = NO,但这些都没有帮助。

我想我可能能够扩展上面的UIAccessibilityElement类别,将各种消息转发到其父单元的子UIPickerView。但这感觉就像令人不快的脆弱的hackery。

有什么更好的想法我可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

当我设置tableView.tableHeaderView = myUITextField并在系统设置应用中启用VoiceOver时,我遇到了同样的崩溃。当我将myUITextField包装在UIView中然后将其分配给tableView.tableHeaderView时,问题已经解决了。

我相信这将是iOS 9或更高版本中的错误,因为UITextField也是UIView的子类。

答案 1 :(得分:0)

您面临的问题必须以不同方式解决。您正在尝试将UIPicker添加到UITableCell,但这是不可能的。看起来无法确定您是否实际滚动/选择了表格单元格或UIPicker。

要解决此问题,请将另一个视图推送到包含UIPicker的表。