Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Я думаю, что проблема в том, что loadMoreCells вызывается слишком много раз.
попробуйте использовать эту проверку вместо willDisplay:
if indexPath.row == yourArrayOfCells.count - 1{
loadMoreCells()
}
ОБНОВЛЕНИЕ
Так что у меня есть некоторые из тех же проблем, после некоторых копаний я нашел это решение для себя:
//conform to UIScrollViewDelegate
let threshold : CGFloat = 10.0 // threshold from bottom of tableView
var isLoadingMore = false //checks if API session ended
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let contentOffset = scrollView.contentOffset.y
let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;
if !isLoadingMore && (maximumOffset - contentOffset) <= threshold {
self.isLoadingMore = true
DispatchQueue.main.async {
loadMoreCells()
self.isLoadingMore = false
}
}
}
Если запрос API происходит слишком быстро и загрузка выглядит смешно, вы можете добавить задержку:
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
loadMoreCells()
self.isLoadingMore = false
}
Если это не сработает, я буду считать, что проблема не в коде, который вы предоставили.
UPDATE-2
Эти 2 функции в setUpCell () не являются необходимыми:
tableView.beginUpdates()
tableView.endUpdates()
Надеюсь, это поможет.
UIView.setAnimationsEnabled(false)
self.tableView.beginUpdates()
self.tableView.insertRows(at: indexPathsToBeInserted, with: UITableViewRowAnimation.none)
self.tableView.endUpdates()
UIView.setAnimationsEnabled(true)