feat: Add generic picker view
This commit is contained in:
@@ -105,6 +105,7 @@
|
||||
DC27EB2F24F6EBE000ACBFE0 /* SettingsSeismicNetworksViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC27EB2E24F6EBE000ACBFE0 /* SettingsSeismicNetworksViewController.swift */; };
|
||||
DC3ADD3924CB2F3D00737919 /* alert_star_trek.wav in Resources */ = {isa = PBXBuildFile; fileRef = 8CF12CC721DE43A400613AC5 /* alert_star_trek.wav */; };
|
||||
DC3BA11124D1A9C90062EE7F /* SubscriptionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC3BA11024D1A9C90062EE7F /* SubscriptionsViewController.swift */; };
|
||||
DC3CE50A250EB7A8005A7DD5 /* EQNGenericPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC3CE509250EB7A8005A7DD5 /* EQNGenericPickerViewController.swift */; };
|
||||
DC52B8A224FC145500ABEBA6 /* SettingsBaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DC52B8A124FC145500ABEBA6 /* SettingsBaseViewController.m */; };
|
||||
DC52B8A524FCCD6900ABEBA6 /* AppTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC52B8A424FCCD6900ABEBA6 /* AppTheme.swift */; };
|
||||
DC886A5D24E92D5500F7A5D3 /* EQNBaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DC886A5C24E92D5500F7A5D3 /* EQNBaseViewController.m */; };
|
||||
@@ -316,6 +317,7 @@
|
||||
DC0E551224F8063300D54270 /* SettingSegmentedTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingSegmentedTableViewCell.swift; sourceTree = "<group>"; };
|
||||
DC27EB2E24F6EBE000ACBFE0 /* SettingsSeismicNetworksViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsSeismicNetworksViewController.swift; sourceTree = "<group>"; };
|
||||
DC3BA11024D1A9C90062EE7F /* SubscriptionsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionsViewController.swift; sourceTree = "<group>"; };
|
||||
DC3CE509250EB7A8005A7DD5 /* EQNGenericPickerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EQNGenericPickerViewController.swift; sourceTree = "<group>"; };
|
||||
DC414C0024CDA09A008D9AE4 /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = CHANGELOG.md; path = ../CHANGELOG.md; sourceTree = "<group>"; };
|
||||
DC52B8A024FC145500ABEBA6 /* SettingsBaseViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SettingsBaseViewController.h; sourceTree = "<group>"; };
|
||||
DC52B8A124FC145500ABEBA6 /* SettingsBaseViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SettingsBaseViewController.m; sourceTree = "<group>"; };
|
||||
@@ -678,6 +680,14 @@
|
||||
path = Storyboards;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
DC3CE508250EB78C005A7DD5 /* Shared */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DC3CE509250EB7A8005A7DD5 /* EQNGenericPickerViewController.swift */,
|
||||
);
|
||||
path = Shared;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
DC99A50124E66DFB0071BC9F /* Commands */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -711,6 +721,7 @@
|
||||
DCDE0BD824E58CCE00209778 /* EQNMainTabBarController.m */,
|
||||
DC886A5B24E92D5500F7A5D3 /* EQNBaseViewController.h */,
|
||||
DC886A5C24E92D5500F7A5D3 /* EQNBaseViewController.m */,
|
||||
DC3CE508250EB78C005A7DD5 /* Shared */,
|
||||
DCD3E3BE24D1555F007C78D4 /* InApp */,
|
||||
DCEFF21024F57163009D3FE1 /* Settings */,
|
||||
);
|
||||
@@ -1132,6 +1143,7 @@
|
||||
8CBD3DC72149B9AD0070C963 /* AppDelegate.m in Sources */,
|
||||
8CA46BA12194532E00C63C16 /* SismaAnnotation.m in Sources */,
|
||||
DCB28CEE24FB8400001F557E /* SettingsViewController.swift in Sources */,
|
||||
DC3CE50A250EB7A8005A7DD5 /* EQNGenericPickerViewController.swift in Sources */,
|
||||
8C602246218D9DB200C799C2 /* PastquakesDettagliMappa.m in Sources */,
|
||||
8CAFD7C82182648600F8BD29 /* EQNRetiSismiViewController.m in Sources */,
|
||||
DCEFF21A24F587E3009D3FE1 /* SettingItem.swift in Sources */,
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
//
|
||||
// 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], completion: @escaping DoneCompletion) {
|
||||
self.onCompletion = completion
|
||||
self.items = items
|
||||
self.selectedIndex = items.count > 0 ? 1 : nil
|
||||
self.pickerView.reloadAllComponents()
|
||||
}
|
||||
|
||||
// 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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user