IOS вставить больше строк ячейки таблицы после последнего индекса - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь сделать неограниченный просмотр таблицы прокрутки (фид).Однако я не могу заставить просмотр таблицы вставить больше ячеек после начальной загрузки.

В моей таблице есть два типа ячеек.Ячейка таблицы представления коллекции и обычная ячейка таблицы изображения + метки.Сборный вид отображается только один раз, и он первый.

Область, которая вызывает у меня проблемы.По крайней мере, он вызывает, просто не добавляет больше ячеек.Кроме того, не уверен, откуда он знает, какой тип ячейки добавить.

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 голосов
/ 22 мая 2018

Вы можете использовать этот код для вставки большего количества строк, когда пользователь подходит к последней ячейке.

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()

        }
    }
}
0 голосов
/ 22 мая 2018

Проблема в том, что вы добавляете 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)
}
0 голосов
/ 22 мая 2018

В этой строке

 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...