@shevzoom
 dev., student at MEPhI

Как подгружать TableView при прокрутке, а не разом?

Я получаю массив из 27 объектов и они сразу отображаются в ячейки.
Как я могу, отобразить лишь часть ячеек и подгружать их при прокрутки далее?

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIScrollViewDelegate {
    
    private let tableView: UITableView = {
       let table = UITableView()
        table.register(NewsTableViewCell.self, forCellReuseIdentifier: NewsTableViewCell.identifier)
        return table
    }()
    
    private var result = [News]()
    private var viewModels = [NewsTableViewCellViewModel]()
    private var isFetchInProgress = false
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(tableView)
        tableView.delegate = self
        tableView.dataSource = self
        view.backgroundColor = .systemBackground
        
        fetchTopStories()
//        self.tableView.tableFooterView?.isHidden = true
    }
    
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        tableView.frame = view.bounds
    }
    
    private func fetchTopStories() {
        APICaller.shared.getTopStories { [weak self] json in
            switch json {
            case .success(let result):

// Вот тут получается массив из 27 ячеек.
                self?.result += result
                self?.viewModels += result.compactMap({
                    NewsTableViewCellViewModel(
                        name: $0.subsite.name,
                        author: $0.author.name,
                        title: $0.title,
                        subtitle: $0.intro ?? "No Description",
                        imageURL: URL(string: $0.cover?.url ?? "")
                    )
                })
                DispatchQueue.main.async {
                    self?.tableView.reloadData()
                }
            case .failure(let error):
                print(error)
            }
        }
    }

    // Table
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return viewModels.count
    }
    
// распихиваю элементы по ячейкам
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(
            withIdentifier: NewsTableViewCell.identifier,
            for: indexPath
        ) as? NewsTableViewCell else {
                fatalError()
            }
        cell.configure(with: viewModels[indexPath.row])
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        let article = result[indexPath.row]
        
        guard let url = URL(string: article.url ?? "") else {
            return
        }
        
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 550
    }
  
//    func scrollViewDidScroll(_ scrollView: UIScrollView) {
//        guard !APICaller.shared.isPagination else {
//            return
//        }
//        let possition = scrollView.contentOffset.y
//        if possition > (tableView.contentSize.height-100-scrollView.frame.size.height) {
////            APICaller.shared.getTopStories { [weak self] json in
////                switch json {
////                case .success(let moreData):
////                    self?.result.append(contentsOf: moreData)
////                    self?.viewModels = result.compactMap({
////                        NewsTableViewCellViewModel(
////                            name: $0.subsite.name,
////                            author: $0.author.name,
////                            title: $0.title,
////                            subtitle: $0.intro ?? "No Description",
////                            imageURL: URL(string: $0.cover?.url ?? "")
////                        )
////
////                    })
////                    dump(moreData)
////                    DispatchQueue.main.async {
////                        self?.tableView.reloadData()
////                    }
////                case .failure(let error):
////                    print(error)
////                }
////            }
//        }
//    }

    
}
  • Вопрос задан
  • 340 просмотров
Решения вопроса 1
briahas
@briahas
ObjC, Swift, Python
Извините, но вы не "распихиваете элементы по ячейкам" - вы отображаете данные в ячейках видимых на экране и подгружаете следующие данные в те же самые ячейки (почитайте про dequeueReusableCell) если вы начинаете скролить и там есть данные которые надо отобразить.

За вопрос "есть ли данные которые надо отобразить" отвечает метод делегата
tableView(_ tableView: .., numberOfRowsInSection:..)


За "подгрузку следующих данных в те же самые ячейки" отвечает метод делегата tableView(_ tableView: .., cellForRowAt:..)

Если мой ответ не отвечает на ваш вопрос, пожалуйста перефразируйте или раскройте свой вопрос больше.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы