我正在尝试制作无限滚动表视图(Feed)。 但是,我无法让tableview在初始加载后插入更多单元格。
我的桌子有两种类型的细胞。集合视图表格单元格和常规图像+标签表格单元格。集合视图只显示一次,它是第一个。
给我问题的区域。它至少会调用,它只是不添加任何更多的单元格。此外,不知道它如何知道要添加哪种类型的单元格。
extension FeedViewController: UITableViewDelegate{
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let lastElement = venueData.count
if indexPath.row == lastElement {
// handle your logic here to get more items, add it to dataSource and reload tableview
print(venueData.count)
print("last")
if(firstLoad){
firstLoad = false
return
}
let appendAmount = 10
currentOffset = currentOffset+appendAmount
let res = venueDataRequest(query:"Any",offset:10,amount:appendAmount)
venueData.append(contentsOf: res )
self.feedTableView.beginUpdates()
self.feedTableView.insertRows(at: [IndexPath(row: venueData.count-appendAmount, section: 0)], with: .automatic)
self.feedTableView.endUpdates()
}
}
}
全班
import UIKit
class FeedViewController: UIViewController {
@IBOutlet weak var feedTableView: UITableView!
let popularPlaces = getPopularPlaces()
var firstLoad = true
var currentOffset = 0
var venueData = venueDataRequest(query:"Any",offset:0,amount:10)
// var venueData: [FeedVenueData] = []
override func viewDidLoad() {
super.viewDidLoad()
feedTableView.dataSource = self
feedTableView.delegate = self
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
extension FeedViewController: UITableViewDelegate{
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let lastElement = venueData.count
if indexPath.row == lastElement {
// handle your logic here to get more items, add it to dataSource and reload tableview
print(venueData.count)
print("last")
if(firstLoad){
firstLoad = false
return
}
let appendAmount = 10
currentOffset = currentOffset+appendAmount
let res = venueDataRequest(query:"Any",offset:10,amount:appendAmount)
venueData.append(contentsOf: res )
self.feedTableView.beginUpdates()
self.feedTableView.insertRows(at: [IndexPath(row: venueData.count-appendAmount, section: 0)], with: .automatic)
self.feedTableView.endUpdates()
}
}
}
extension FeedViewController: UITableViewDataSource{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1+venueData.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if(indexPath.row == 0){
let cell = tableView.dequeueReusableCell(withIdentifier: "FeedPopularPlaceCollectionViewTableViewCell", for: indexPath) as! FeedPopularPlaceCollectionViewTableViewCell
cell.setup()
return cell
}else{
let cell = tableView.dequeueReusableCell(withIdentifier: "FeedVenueTableViewCell", for: indexPath) as! FeedVenueTableViewCell
let pos = indexPath.row - 1
cell.venueName.text = venueData[pos].name
cell.venueImage.image = venueData[pos].image
print(indexPath.row)
return cell
}
}
}
答案 0 :(得分:1)
当用户访问最后一个单元格时,您可以使用此代码插入更多行。
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
//Bottom Refresh
if scrollView == feedTableView {
if ((scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height) {
//Insert Row in Tableview
print(venueData.count)
print("last")
if(firstLoad){
firstLoad = false
return
}
let appendAmount = 10
currentOffset = currentOffset+appendAmount
let res = venueDataRequest(query:"Any",offset:10,amount:appendAmount)
venueData.append(contentsOf: res )
self.feedTableView.beginUpdates()
self.feedTableView.insertRows(at: [IndexPath(row: venueData.count-appendAmount, section: 0)], with: .automatic)
self.feedTableView.endUpdates()
}
}
}
答案 1 :(得分:1)
问题是因为您添加了10个项目,但只插入了1个单元格。第一次调用后,if indexPath.row == lastElement
永远不会再次到达,因为indexPath.row = 1
和lastElement = 10
。
要修复它,而不是只插入1个单元格,请在添加新项目后插入10个单元格并在主队列上调用insertRows
var indexPaths = (venueData.count-appendAmount+1..<venueData.count+1).map { IndexPath(row: $0, section: 0) }
DispatchQueue.main.async {
self.feedTableView.insertRows(at: indexPaths, with: .automatic)
}
答案 2 :(得分:0)
在这一行
self.feedTableView.insertRows(at: [IndexPath(row: venueData.count-appendAmount, section: 0)], with: .automatic)
为什么要在索引venueData.count-appendAmount
self.feedTableView.insertRows(at: [IndexPath(row: venueData.count, section: 0)], with: .automatic)