Как я могу избежать сбоя, когда VoiceOver встречает UIPickerView как подпредставление UITableViewCell contentView? - PullRequest
1 голос
/ 11 сентября 2010

В моем приложении у меня есть UIPickerView как подпредставление contentView ячейки таблицы. Я отключаю прокрутку в табличном представлении, и устройство работает нормально при нормальных обстоятельствах. Однако я обнаружил, что при включении VoiceOver (или инспектора специальных возможностей) приложение вылетает, как только сборщик должен получить фокус.

Ошибка:

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

Кажется, что происходит, что VoiceOver отправляет сообщения, предположительно предназначенные для UIPickerView (или его собственного UIAccessibilityElement?), Вместо этого в UITableViewAccessibilityElement.

Когда я исправляю 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 его родительской ячейки. Но это похоже на неприятно хрупкое хакерство.

Есть лучшие идеи, как мне обойти это?

Ответы [ 2 ]

1 голос
/ 31 октября 2016

У меня был такой же сбой, когда я просто установил tableView.tableHeaderView = myUITextField и включил VoiceOver в приложении настройки системы. Теперь проблема решена, когда я обертываю myUITextField в UIView, а затем назначаю его tableView.tableHeaderView.

Я считаю, что это будет ошибкой в ​​iOS 9 или более поздней версии, поскольку UITextField также является подклассом UIView.

0 голосов
/ 16 мая 2011

Проблема, с которой вы сталкиваетесь, должна решаться по-другому.Вы пытаетесь добавить UIPicker в UITableCell, но это невозможно.Похоже, невозможно определить, действительно ли вы прокручивали / выбирали ячейку таблицы или UIPicker.

Чтобы устранить эту проблему, перенесите в таблицу другое представление, содержащее UIPicker.

...