iPhone: секционный глюк рендеринга UITableView с помощью insertRowsAtIndexPaths - PullRequest
2 голосов
/ 27 августа 2009

Я надеюсь, что вы можете помочь, так как я немного застрял в том, где искать решение этой проблемы UITableView, которая у меня возникла:

Когда я вставляю новый элемент в верхней части раздела UITableView, используя следующий метод (см. Код ниже), все это прекрасно работает, за исключением этого сбоя: вставленная строка в верхней части раздела отображается, как и ожидалось, с закругленными углами вверху слева и справа. Проблема в том, что строки ниже не обновляются визуально, т.е. вторая строка / ячейка все еще имеет закругленные углы, тогда как теперь она должна быть в квадрате по верхним углам - , пожалуйста, смотрите этот скриншот для пояснения после анимации для вставить новую строку в верхней части второго раздела произошло. Смотрите углы ячеек, поскольку они не были обновлены.

// Amend the data source before updating the view to reflect the changes
[[self.playerData objectAtIndex: 0] removeObjectAtIndex: row];
[[self.playerData objectAtIndex: 1] insertObject:playerName atIndex:0];

// Amend the view to reflect changes
NSArray *deleteIndexPaths = [NSArray arrayWithObjects:
    [NSIndexPath indexPathForRow:row inSection:0],
    nil];

NSArray *insertIndexPaths = [NSArray arrayWithObjects:
    [NSIndexPath indexPathForRow:0 inSection:1],
    nil];

[self.playerTableView beginUpdates];
[self.playerTableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation: UITableViewRowAnimationLeft];
[self.playerTableView deleteRowsAtIndexPaths:deleteIndexPaths withRowAnimation: UITableViewRowAnimationLeft];
[self.playerTableView endUpdates];

Конечно, если я только что отправил сообщение: [self.playerTableView reloadData]; вид будет отображаться правильно. Однако нам действительно нужно, чтобы эта процедура была анимированной, чтобы обеспечить приятное впечатление. Возможно, если бы было завершено делегированное событие по завершении анимации вставки, я мог бы обновить представление из источника данных, чтобы избавиться от сбоев, но я не нашел подобного хука.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 27 августа 2009

Нашли ответ. Это может быть не самым эффективным, хотя это будет хорошо в наших условиях, поскольку мы имеем дело только с несколькими ячейками здесь. Я исправил это, обновив другие ячейки, которые не были перерисованы явно:

// Fix for cells not rendered correctly after insertion of top cell]
[self.playerTableView reloadRowsAtIndexPaths:reloadIndexPaths withRowAnimation: UITableViewRowAnimationNone];

Вероятно, я просто ожидал слишком многого от UITableView: чтобы он уладил углы для меня во время выполнения insertRowsAtIndexPaths.

К сведению, этот код был размещен сразу после блока beginUpdates-endUpdates. Все остальное, кажется, вызывает сбой, хотя и не исследовано.

Спасибо.

0 голосов
/ 12 ноября 2016

Лучший вариант - перезагрузить видимые строки, а затем вставить новые строки.

self.tableView.beginUpdates()
self.tableView.reloadRowsAtIndexPaths(self.tableView.indexPathsForVisibleRows!, withRowAnimation: UITableViewRowAnimation.Fade)
self.tableView.insertRowsAtIndexPaths(indexPaths, withRowAnimation: UITableViewRowAnimation.Fade)
self.tableView.endUpdates()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...