Created
April 14, 2020 15:12
-
-
Save prafullakumar/89af69cbd4b7581a23a71c099463b859 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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