116 lines
3.8 KiB
Swift
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
|
|
}
|
|
}
|