ios 5 прототип ячейки и проблема VoiceOver - PullRequest
6 голосов
/ 25 ноября 2011

У меня проблема при попытке загрузить прототип ячейки, когда Voiceover включен. Приложение вылетает, и я получаю ошибки

Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:]

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

Это происходит только тогда, когда VoiceOver включен, в противном случае приложение работает нормально. Любая помощь?

1 Ответ

0 голосов
/ 17 октября 2012

Я не уверен, правильно ли я понял это, но это сработало для меня. В 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. Reuse Identifier set in Interface Builder

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...