From d776ba9c6ec94d6622e1f759c112fd2334b7fb8b Mon Sep 17 00:00:00 2001 From: Nicholas Tay Date: Mon, 21 Mar 2022 19:36:43 +1100 Subject: Loading overlay to custom class + add to coordinator Just an idea I had, since it was quite messy that a TableViewController was handling all that. Instead now it should be reusable through the ForayCoordinator itself, which means e.g. on details screen, we can show the loading overlay. --- foray/ForayCoordinator.swift | 10 ++++++++++ foray/ForayLoadingOverlay.swift | 37 ++++++++++++++++++++++++++++++++++++ foray/ForayTableViewController.swift | 12 ++---------- 3 files changed, 49 insertions(+), 10 deletions(-) create mode 100644 foray/ForayLoadingOverlay.swift (limited to 'foray') diff --git a/foray/ForayCoordinator.swift b/foray/ForayCoordinator.swift index 8fe6656..6497ec0 100644 --- a/foray/ForayCoordinator.swift +++ b/foray/ForayCoordinator.swift @@ -15,9 +15,11 @@ protocol ForayCoordinated: UIViewController { class ForayCoordinator: Coordinator { var childCoordinators = [Coordinator]() var navigationController: UINavigationController + var loadingOverlay: ForayLoadingOverlay init(navigationController: UINavigationController) { self.navigationController = navigationController + self.loadingOverlay = ForayLoadingOverlay(viewController: navigationController) } private func push(vc: ForayCoordinated, animated: Bool = true) { @@ -50,4 +52,12 @@ class ForayCoordinator: Coordinator { detailViewController.setDetails(name: item.name, description: description, image: image) push(vc: detailViewController) } + + func showLoading() { + loadingOverlay.show() + } + + func hideLoading() { + loadingOverlay.hide() + } } diff --git a/foray/ForayLoadingOverlay.swift b/foray/ForayLoadingOverlay.swift new file mode 100644 index 0000000..1aa6260 --- /dev/null +++ b/foray/ForayLoadingOverlay.swift @@ -0,0 +1,37 @@ +// +// ForayLoadingOverlay.swift +// foray +// +// Created by Nicholas Tay on 21/3/2022. +// + +import UIKit + +class ForayLoadingOverlay { + + var viewController: UIViewController + + let loadingIndicator: UIActivityIndicatorView = { + let aiv = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50)) + aiv.hidesWhenStopped = true + aiv.style = UIActivityIndicatorView.Style.medium + aiv.startAnimating() + return aiv + }() + + let alert: UIAlertController = UIAlertController(title: nil, message: "Grabbing data...", preferredStyle: .alert) + + init(viewController: UIViewController) { + self.viewController = viewController + alert.view.addSubview(self.loadingIndicator) + } + + func show() { + viewController.present(alert, animated: true) + } + + func hide() { + viewController.dismiss(animated: false) + } + +} diff --git a/foray/ForayTableViewController.swift b/foray/ForayTableViewController.swift index 827d4ea..2b7ba65 100644 --- a/foray/ForayTableViewController.swift +++ b/foray/ForayTableViewController.swift @@ -33,18 +33,9 @@ class ForayTableViewController: UITableViewController, ForayCoordinated { tableView.register(ForayNewTableViewCell.self, forCellReuseIdentifier: "ForayNewTableViewCell") // Not sure if this is the right way to go about this... - let alert = UIAlertController(title: nil, message: "Grabbing data...", preferredStyle: .alert) - let loadingIndicator = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50)) - loadingIndicator.hidesWhenStopped = true - loadingIndicator.style = UIActivityIndicatorView.Style.medium - loadingIndicator.startAnimating(); - alert.view.addSubview(loadingIndicator) - present(alert, animated: true, completion: nil) - + coordinator?.showLoading() reloadApiData() - dismiss(animated: false, completion: nil) - self.refreshControl = UIRefreshControl() self.refreshControl?.addTarget(self, action: #selector(doRefresh), for: UIControl.Event.valueChanged) } @@ -71,6 +62,7 @@ class ForayTableViewController: UITableViewController, ForayCoordinated { self.tableView.reloadData() self.refreshControl?.endRefreshing() + self.coordinator?.hideLoading() }) } -- cgit