views:

38

answers:

0

In my app I have a UIPickerView as a subview of a table cell's contentView. I disable scrolling in the table view, and the arrangement works fine under normal circumstances. However, I've found that when VoiceOver (or the Accessibility Inspector) is turned on, the app crashes as soon as the picker is due to get focus.

The error is:

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

What seems to be happening is that VoiceOver is sending messages presumably intended for the UIPickerView (or its own UIAccessibilityElement?) to the UITableViewAccessibilityElement instead.

When I patch UIAccessibilityElement with the following category...

@implementation UIAccessibilityElement (GMPatches)

- (NSInteger)numberOfComponents {
  return 0;
}

@end

... I eliminate the crash -- but now, unsurprisingly, VoiceOver cannot change the UIPickerView value.

And if I change it to the true value in this context...

@implementation UIAccessibilityElement (GMPatches)

- (NSInteger)numberOfComponents {
  return 1;
}

@end

... then VoiceOver sends the next misaddressed message, bringing everything down again:

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

I'm feeling fairly sure this is an iOS bug.

I've tried setting isAccessibilityElement = NO on the picker, the table cell and the table cell's content view, none of which helps.

I guess I might be able to expand the UIAccessibilityElement category above to forward various messages to its parent cell's child UIPickerView. But this feels like unpleasantly brittle hackery.

Any better ideas how I might work around this?