Files
eqn.ios/Sources/Earthquake Network/Controllers/Shared/EQNGenericPickerViewController.swift
2020-09-28 10:26:33 +02:00

116 lines
3.8 KiB
Swift

//
// EQNGenericPickerViewController.swift
// Earthquake Network
//
// Created by Busi Andrea on 13/09/2020.
// Copyright © 2020 Earthquake Network. All rights reserved.
//
import Foundation
/// Protocollo per rappresentare elementi nel picker generico
protocol PickerRepresentable {
var pickerTitle: String { get }
}
class EQNGenericPickerViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
typealias DoneCompletion = (PickerRepresentable) -> Void
var onCompletion: DoneCompletion?
var onCancel: (() -> Void)?
// MARK: - Properties
private var selectedIndex: Int?
private var items = [PickerRepresentable]()
private lazy var pickerView: UIPickerView = {
let picker = UIPickerView(frame: .zero)
picker.delegate = self
picker.dataSource = self
return picker
}()
private lazy var toolbar: UIToolbar = {
let toolbar = UIToolbar()
toolbar.barStyle = .default
toolbar.isTranslucent = true
let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneTapped(_:)))
let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let cancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelTapped(_:)))
toolbar.setItems([cancelButton, spaceButton, doneButton], animated: false)
return toolbar
}()
// MARK: - View Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .clear
toolbar.translatesAutoresizingMaskIntoConstraints = false
pickerView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(pickerView)
view.addSubview(toolbar)
pickerView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
pickerView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
pickerView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
toolbar.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
toolbar.trailingAnchor.constraint(equalTo: pickerView.trailingAnchor).isActive = true
toolbar.leadingAnchor.constraint(equalTo: pickerView.leadingAnchor).isActive = true
}
// MARK: - Public
public func configure(with items: [PickerRepresentable], selectedIndex: Int? = nil, completion: @escaping DoneCompletion) {
self.onCompletion = completion
self.items = items
self.selectedIndex = items.count > 0 ? 1 : nil
self.pickerView.reloadAllComponents()
if let selectedIndex = selectedIndex, 0..<items.count ~= selectedIndex {
self.selectedIndex = selectedIndex
self.pickerView.selectRow(selectedIndex, inComponent: 0, animated: false)
}
}
// MARK: - Actions
@objc func doneTapped(_ sender: Any) {
guard let index = selectedIndex else {
return
}
onCompletion?(items[index])
}
@objc func cancelTapped(_ sender: Any) {
onCancel?()
}
// MARK: - UIPickerViewDataSource
func numberOfComponents(in pickerView: UIPickerView) -> Int {
1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
items.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
items[row].pickerTitle
}
// MARK: - UIPickerViewDataDelegate
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
selectedIndex = row
}
}