[SWIFT] Traitement de lecture / actualisation / mise à jour des données dans TableView

introduction

Lors de l'affichage d'un article dans TableView à l'aide de l'API fournie par Qiita, j'ai implémenté __read __ / __ refresh __ / __ update __ de données, donc je l'ai publié sous forme de mémorandum. Faire.

Aperçu

  1. Acquisition initiale de «QiitaAPI»
  2. Actualisez le QiitaAPI acquis
  3. Obtenez des QiitaAPI supplémentaires lors du défilement vers le bas de TableView

Environnement d'exploitation

【Xcode】Version 12.0.1 【Swift】Version 5.3

Code d'implémentation

CustomTableView.swift


import UIKit

class CustomTableView: UITableView {
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }
    
    override init(frame:CGRect, style: UITableView.Style) {
        super.init(frame: frame, style: .plain)
        setup()
    }
        
    private func setup() {
        let refreshControl = UIRefreshControl()
        refreshControl.attributedTitle = NSAttributedString(string: "Chargement")
        self.refreshControl = refreshControl
        //Ligne lorsque UITableView est vide(séparateur)Définir une vue vide à désactiver
        self.tableFooterView = UIView()
    }
        
    func addTargetToRefreshControl(_ target: Any?, action: Selector, event: UIControl.Event) {
        self.refreshControl?.addTarget(target, action: action, for: event)
    }

    func beginRefreshing() {
        guard let refreshControl = self.refreshControl else { return }
        refreshControl.beginRefreshing()
        refreshControl.sendActions(for: .valueChanged)
        self.contentOffset.y = -self.bounds.height
    }
    
    func endRefreshing() {
        guard let refreshControl = self.refreshControl else { return }
        refreshControl.endRefreshing()
    }
    
}

ViewController.swift


class ViewController: UIViewController {
    
    @IBOutlet private weak var tableView: CustomTableView!

    private var reloading: Bool = false
    private var page: Int = 20

    #···réduction···

    override func viewDidLoad() {
        super.viewDidLoad()
        #···réduction···
        tableView.addTargetToRefreshControl(self, action: #selector(self.refreshArticlesAction), event: .valueChanged)
        //Appeler refreshControl et charger
        tableView.beginRefreshing()
               
        #・ ・ ・ Omis (Processus d'acquisition des données de Qiita) ・ ・ ・
        tableView.endRefreshing()
        tableView.reloadData()
    }
        
    @objc private func refreshArticlesAction() {
        //Initialiser le nombre d'acquisitions
        page = 20
       
        #・ ・ ・ Omis (Processus d'acquisition des données de Qiita) ・ ・ ・
        tableView.endRefreshing()
        tableView.reloadData()
    }
    
}

#···réduction···

extension ViewController: UITableViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let height = scrollView.frame.size.height
        let contentYoffset = scrollView.contentOffset.y
        let distanceFromBottom = scrollView.contentSize.height - contentYoffset
        if distanceFromBottom < height {
            //Définissez la variable: reloading sur true pendant le rechargement car elle sera appelée plusieurs fois.
            if !reloading && page < 100 {
                //Augmenter de 20 le nombre d'acquisitions
                if page <= 100 { page += 20 }
                //Remplacez l'indicateur de traitement de rechargement par "true"
                reloading.toggle()

                #・ ・ ・ Omis (Processus d'acquisition des données de Qiita) ・ ・ ・
                //Remplacez l'indicateur du processus de rechargement par "faux"
                reloading.toggle()
                tableView.reloadData()
            }
        }
    }
}

Détails d'implémentation

1. Acquisition initiale de «QiitaAPI»

output1.gif

2. Actualisez le QiitaAPI acquis

output3.gif

CustomTableView.swift


func addTargetToRefreshControl(_ target: Any?, action: Selector, event: UIControl.Event) {
    self.refreshControl?.addTarget(target, action: action, for: event)
}

ViewController.swift


tableView.addTargetToRefreshControl(self, action: #selector(self.refreshArticlesAction), event: .valueChanged)

3. Obtenez des QiitaAPI supplémentaires lors du défilement vers le bas de TableView

output2.gif

ViewController.swift


func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let height = scrollView.frame.size.height
    let contentYoffset = scrollView.contentOffset.y
    let distanceFromBottom = scrollView.contentSize.height - contentYoffset
    if distanceFromBottom < height {
        //Définissez la variable: reloading sur true pendant le rechargement car elle sera appelée plusieurs fois.
        if !reloading && page < 100 {
            //Ajouter 20 acquisitions
            if page <= 100 { page += 20 }
            //Remplacez l'indicateur de traitement de rechargement par "true"
            reloading.toggle()

            #・ ・ ・ Omis (Processus d'acquisition des données de Qiita) ・ ・ ・
            //Remplacez l'indicateur du processus de rechargement par "faux"
            reloading.toggle()
            tableView.reloadData()
        }
    }
}

référence

Recommended Posts

Traitement de lecture / actualisation / mise à jour des données dans TableView
Techniques de lecture du code source Java dans Eclipse
Implémentation du traitement asynchrone pour un seul locataire dans Tomcat