[SWIFT] Verarbeitung zum Lesen / Aktualisieren / Aktualisieren von Daten in TableView

Einführung

Beim Anzeigen eines Artikels in "TableView" unter Verwendung der von Qiita bereitgestellten API habe ich __read __, __ refresh __, __ update __ von Daten implementiert und ihn als Memorandum veröffentlicht. Machen.

Überblick

  1. Erstmalige Übernahme von "QiitaAPI"
  2. Aktualisieren Sie das erworbene "QiitaAPI"
  3. Holen Sie sich zusätzliches QiitaAPI, wenn Sie zum Ende von TableView scrollen

Betriebsumgebung

【Xcode】Version 12.0.1 【Swift】Version 5.3

Implementierungscode

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: "Wird geladen")
        self.refreshControl = refreshControl
        //Zeile, wenn UITableView leer ist(Separator)Stellen Sie eine leere Ansicht zum Deaktivieren ein
        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

    #···Kürzung···

    override func viewDidLoad() {
        super.viewDidLoad()
        #···Kürzung···
        tableView.addTargetToRefreshControl(self, action: #selector(self.refreshArticlesAction), event: .valueChanged)
        //Rufen Sie refreshControl auf und laden Sie
        tableView.beginRefreshing()
               
        #・ ・ ・ Ausgelassen (Prozess zum Erfassen von Daten von Qiita) ・ ・ ・
        tableView.endRefreshing()
        tableView.reloadData()
    }
        
    @objc private func refreshArticlesAction() {
        //Initialisieren Sie die Anzahl der Akquisitionen
        page = 20
       
        #・ ・ ・ Ausgelassen (Prozess zum Erfassen von Daten von Qiita) ・ ・ ・
        tableView.endRefreshing()
        tableView.reloadData()
    }
    
}

#···Kürzung···

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 {
            //Da es viele Male aufgerufen wird, setzen Sie die Variable: reloading während des erneuten Ladens auf true.
            if !reloading && page < 100 {
                //Erhöhen Sie die Anzahl der Akquisitionen um 20
                if page <= 100 { page += 20 }
                //Ändern Sie das Reload-Verarbeitungsflag in "true".
                reloading.toggle()

                #・ ・ ・ Ausgelassen (Prozess zum Erfassen von Daten von Qiita) ・ ・ ・
                //Ändern Sie das Flag für die Neuladeverarbeitung in "false".
                reloading.toggle()
                tableView.reloadData()
            }
        }
    }
}

Implementierungsdetails

1. Erstmalige Übernahme von "QiitaAPI"

output1.gif

2. Aktualisieren Sie das erworbene "QiitaAPI"

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. Holen Sie sich zusätzliches QiitaAPI, wenn Sie zum Ende von TableView scrollen

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 {
        //Da es viele Male aufgerufen wird, setzen Sie die Variable: reloading während des erneuten Ladens auf true.
        if !reloading && page < 100 {
            //Erhöhen Sie die Anzahl der Akquisitionen um 20
            if page <= 100 { page += 20 }
            //Ändern Sie das Reload-Verarbeitungsflag in "true".
            reloading.toggle()

            #・ ・ ・ Ausgelassen (Prozess zum Erfassen von Daten von Qiita) ・ ・ ・
            //Ändern Sie das Flag für die Neuladeverarbeitung in "false".
            reloading.toggle()
            tableView.reloadData()
        }
    }
}

Referenz

Recommended Posts

Verarbeitung zum Lesen / Aktualisieren / Aktualisieren von Daten in TableView
Techniken zum Lesen von Java-Quellcode in Eclipse
Implementierung der asynchronen Verarbeitung für einen einzelnen Mandanten in Tomcat