// // 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.. 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 } }