Skip to content

Instantly share code, notes, and snippets.

@prafullakumar
Created April 14, 2020 15:12
Show Gist options
  • Save prafullakumar/89af69cbd4b7581a23a71c099463b859 to your computer and use it in GitHub Desktop.
Save prafullakumar/89af69cbd4b7581a23a71c099463b859 to your computer and use it in GitHub Desktop.
final class Coordinator: NSObject {
var text: Binding<String>
var pickerType: TextView.PickerType
init(text: Binding<String>, pickerType: TextView.PickerType) {
self.pickerType = pickerType
self.text = text
}
private func setPickerType(textField: UITextField) {
switch pickerType {
case .keyboard(let type):
textField.keyboardType = type //if keyboard set keyboard type
textField.inputView = nil
case .customList:
textField.inputView = getPicker() //create custom picker set to input view
case .datePicker(let minDate, let maxDate):
textField.inputView = getDatePicker(minDate: minDate, maxDate: maxDate) //create date picker set to input view
}
textField.inputAccessoryView = getToolBar() //create done toolbar
}
//Mark: custom Picker
private func getPicker() -> UIPickerView {
let picker = UIPickerView()
picker.backgroundColor = UIColor.systemBackground
picker.delegate = self
picker.dataSource = self
return picker
}
//Mark: date Picker
private func getDatePicker(minDate: Date, maxDate: Date) -> UIDatePicker {
let picker = UIDatePicker()
picker.datePickerMode = .date
picker.backgroundColor = UIColor.systemBackground
picker.maximumDate = maxDate
picker.minimumDate = minDate
picker.addTarget(self, action: #selector(handleDatePicker(sender:)), for: .valueChanged)
return picker
}
@objc func handleDatePicker(sender: UIDatePicker) {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd MMM yyyy"
text.wrappedValue = dateFormatter.string(from: sender.date)
}
//Mark: Toolbar
private func getToolBar() -> UIToolbar {
let toolBar = UIToolbar()
toolBar.barStyle = UIBarStyle.default
toolBar.backgroundColor = UIColor.systemBackground
toolBar.isTranslucent = true
toolBar.sizeToFit()
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: nil, action: nil)
let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.done, target: self, action: #selector(self.donePicker))
toolBar.setItems([spaceButton, doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
return toolBar
}
@objc func donePicker() {
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
}
}
extension Coordinator: UIPickerViewDataSource{
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
switch pickerType {
case .customList(let list):
return list.count
default:
return 0
}
}
}
extension Coordinator: UIPickerViewDelegate {
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
switch pickerType {
case .customList(let list):
return list[row]
default:
return ""
}
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
switch pickerType {
case .customList(let list):
text.wrappedValue = list[row]
default:
break
}
}
}
extension Coordinator: UITextFieldDelegate {
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
setPickerType(textField: textField)
return true
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
defer {
if let currentText = textField.text, let stringRange = Range(range, in: currentText) {
text.wrappedValue = currentText.replacingCharacters(in: stringRange, with: string)
}
}
return true
}
func textFieldDidEndEditing(_ textField: UITextField) {
donePicker()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment