Я разработаю pagination
в tableView
на примере. Вы можете пройти через это и затем внедрить это в свой проект.
1. Предположим, у вас есть массив String, содержащий около 500 элементов.
var allUsers = [String](repeating: "User", count: 500)
2. Создайте еще один String array
, который изначально содержит первые 10 элементов из allUsers
array
.
var dataSource = [String]()
override func viewDidLoad() {
super.viewDidLoad()
self.addElements() //explained next..
}
dataSource array
будет действовать как фактический dataSource
для tableView
.
3. Давайте сохраним offset
, который будет отслеживать index
, из которого нам нужно добавить следующие 10 элементов, т.е.
var nextOffset = 0
func addElements() {
let newOffset = nextOffset+10
for i in nextOffset..<newOffset {
dataSource.append(allUsers[i])
}
nextOffset = newOffset
}
addElements()
метод просто добавить следующие 10 элементов, начиная с nextOffset
.
4. Методы UITableViewDataSource
выглядят так,
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dataSource.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = "\(dataSource[indexPath.row]) : \(indexPath.row)"
return cell
}
5. Теперь реализуем метод UITableViewDelegate
- tableView(_:willDisplay:forRowAt:)
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let currentCount = self.dataSource.count
if currentCount < 500 && indexPath.row == (currentCount-1) { //last row
self.addData()
self.setUpLoaderView(toShow: true)
} else {
self.setUpLoaderView(toShow: false)
}
}
В вышеупомянутых методах я проверил, отображается ли cell
за последние row
. Если да, то мы добавляем к нему больше данных, используя метод addData()
, и показываем loaderView
снизу, используя метод setUpLoaderView(toShow:)
.
6. Вот определение обоих методов,
func addData() {
DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
self.addElements()
self.tableView.reloadData()
}
}
func setUpLoaderView(toShow: Bool) {
if toShow {
self.tableView.tableFooterView?.isHidden = false
self.tableView.tableFooterView = self.loaderMoreView
} else {
self.tableView.tableFooterView = UIView()
}
}
В addData()
Я добавил delay
из 10 seconds
согласно вашему требованию. Таким образом, loader
будет отображаться для 10 seconds
до обновления tableView
новыми данными.
7. loaderMoreView
- это просто UIActivityIndicatorView
, установленный как tableFooterView
, например:
private lazy var loaderMoreView: UIView = {
let loaderView = UIActivityIndicatorView(style: .whiteLarge)
loaderView.color = UIColor.gray
loaderView.startAnimating()
return loaderView
}()