Я не уверен, правильно ли я понял это, но это сработало для меня. В UITableViewDataSource
:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
[...]
UITableViewCell *standardCell;
if (UIAccessibilityIsVoiceOverRunning()) {
standardCell = [tableView dequeueReusableCellWithIdentifier:@"VO Cell"];
} else {
standardCell = [tableView dequeueReusableCellWithIdentifier:@"Regular Cell"];
}
//Configure the cell
[...]
return standardCell;
}
Я полагаю, что это тот случай, когда iOS кэширует Cells без свойств доступности, если VoiceOver отключен по соображениям производительности. Поэтому используемый по умолчанию Идентификатор может быть связан с кэшированной ячейкой, которая не имеет этих свойств. Когда VoiceOver включен и iOS пытается удалить эти ячейки из очереди, он не находит там свойства и ломается. Имея разные идентификаторы, вы заставляете iOS кэшировать новые ячейки при включенном VO.
Опять же, это только предположение, которое я делаю , но дело в том, что у меня не возникает эта проблема, когда я снимаю с ячеек таким образом. Однако, если вы удалите их из очереди, как я упоминал, вам придется остерегаться ошибки, которая может возникнуть:
Если вы снимаете с ячеек ячейки, чьи идентификаторы установлены в файле .xib или в раскадровке, как показано на рисунке ниже, вам потребуется установить другую ячейку прототипа с идентификатором повторного использования VO.