@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)
////                }
////            }
//        }
//    }

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

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


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

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

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

Войти через центр авторизации
Похожие вопросы