ios在最后一个索引后插入更多表格单元格行

时间:2018-05-22 03:59:25

标签: ios swift uitableview

我正在尝试制作无限滚动表视图(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
        }
    }

}

3 个答案:

答案 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 = 1lastElement = 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)