Перезагрузить TableView только в новых добавленных ячейках
У меня есть функция scrollToBottom, которая уведомляет приложение о том, когда следует начинать BatchFetches для содержимого, изображений и проверок.
//1: User Scrolls all the way down calls beginBatchFetch()
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let offsetY = scrollView.contentOffset.y
let contentHeight = scrollView.contentSize.height
print("offsetY: \(offsetY)")
if offsetY > contentHeight - scrollView.frame.height {
if self.viewSelected == "Content" {
if !contentFetchMore {
beginContentBatchFetch()
}
} else if self.viewSelected == "Pics" {
if !picFetchMore {
beginPicBatchFetch()
}
} else if self.viewSelected == "Checks" {
if !checksFetchMore {
beginChecksBatchFetch()
}
}
}
}
Это beginBatchFetchMethods. Self.reload в настоящее время перезагружает весь Tableview:
func beginContentBatchFetch() {
contentFetchMore = true
ProgressHUD.show()
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
self.checkQueryContinous()
ProgressHUD.dismiss()
}
}
func beginPicBatchFetch() {
picFetchMore = true
ProgressHUD.show()
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
self.PicContinous()
self.Reload()
ProgressHUD.dismiss()
}
}
func beginChecksBatchFetch() {
checksFetchMore = true
ProgressHUD.show()
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
self.checkQueryContinous()
self.Reload()
ProgressHUD.dismiss()
}
}
Вместо перезагрузки всего TableView. Я хотел бы перезагрузить только новые добавленные ячейки. Например, если бы у меня было 10 ячеек до пакетной выборки, а затем 20 ячеек после пакетной выборки, я бы хотел перезагрузить табличное представление только для этих ячеек 11-20.
Я поискал в Интернете, и StackOverFlow привел меня к этому: Ошибка компиляции iOS Swift и reloadRowsAtIndexPaths
var _currentIndexPath:NSIndexPath?
if let indexPath = _currentIndexPath {
self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation:
UITableViewRowAnimation.None)
}
else {
` //_currentIndexPath` is nil.
// Error handling if needed.
}
Это, насколько я понимаю, перезагружает только отображаемые ячейки. Однако мои пакетные выборки могут не возвращать больше значений. В результате в моем табличном представлении будут отображаться те же ячейки, что и до пакетной выборки, и это перезагрузит эти ячейки. Поскольку эти ячейки были ранее загружены, я не хочу тратить зря данные / испортить представление таблицы.
Что мне делать, спасибо?
2 ответа
Что вам нужно сделать, так это вычислить строки, которые необходимо перезагрузить, и убедиться, что вы передали эти indexPath в функцию перезагрузки строк после обновления источника данных новыми данными.
private func calculateIndexPathsToReload(from newItems: [Items]) -> [IndexPath] {
let startIndex = results!.count - newItems.count
let endIndex = startIndex + newItems.count
return (startIndex..<endIndex).map { IndexPath(row: $0, section: 0) }
}
Вот что я добавил к: https://www.youtube.com/watch?v=whbyVPFFh4M
Возможно, я напортачил с функцией цикла for. Я еще не очень разбираюсь в картировании.
func beginContentBatchFetch() {
contentFetchMore = true
ProgressHUD.show()
let oldcount = contentObjectIdArray.count
var IndexPathsToReload = [IndexPath]()
var startIndex = Int()
var endIndex = Int()
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
self.checkQueryContinous()
let newElements = self.contentObjectIdArray.count - oldcount
startIndex = self.contentObjectIdArray.count - newElements
endIndex = self.contentObjectIdArray.count
for index in startIndex..<endIndex {
let indexPath = IndexPath(row: index, section: 0)
IndexPathsToReload.append(indexPath)
}
if newElements > 0 {
self.BarSelectedTableView.reloadRows(at: IndexPathsToReload, with: .fade)
}
ProgressHUD.dismiss()
}
}