Я настраиваю очень простое приложение для iPhone, которое имеет несколько текстовых полей, которые используют элементы управления выбора даты для ввода строк даты и времени.
Проблема в том, что, когда все работает отлично, яобнаружение, что я дублирую много кода для нескольких полей, что кажется плохой практикой.
Что мне хотелось бы, так это способ сжать этот код в отдельный класс и просто вызывать его из любого места, когда янужно это.
Ниже приведен пример того, что у меня есть в моем контроллере представления, который работает очень хорошо, но его пришлось бы многократно дублировать для нескольких полей:
@IBOutlet weak var dateField: UITextField!
@objc func dateFieldModified(sender:UIDatePicker) {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM/dd/yyyy"
dateField.text = dateFormatter.string(from: sender.date)
}
@IBAction func dateFieldModify(_ sender: UITextField) {
let datePicker = UIDatePicker()
datePicker.datePickerMode = UIDatePicker.Mode.date
datePicker.addTarget(self, action: #selector(self.dateFieldModified(sender:)), for: UIControl.Event.valueChanged)
dateField.inputView = datePicker
}
Подводя итог, когда пользователь вводит текстовое поле «dateField», всплывающее окно выбора даты и позволяет пользователю прокручивать и выбирать дату.Когда пользователь выбирает дату, текстовое поле устанавливается так, чтобы оно отражало выбранную дату.
То, что я хотел бы сделать в моем контроллере представления, - это сделать что-то вроде этого:
@IBOutlet weak var dateField: UITextField!
@IBAction func dateFieldModify(_ sender: UITextField) {
let datePicker = DatePicker(field:dateField, mode:"date", format: "MM/dd/yyyy")
datePicker.loadDatePicker()
}
И есть класс, который определен отдельно, который может выглядеть примерно так:
class DatePicker {
var field:UITextField
var mode:String
var format:String
init(field:UITextField, mode:String, format:String) {
self.field = field
self.mode = mode
self.format = format
}
@objc func dateFieldModified(sender:UIDatePicker) {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = format
field.text = dateFormatter.string(from: sender.date)
}
func loadDatePicker() {
let datePicker = UIDatePicker()
datePicker.datePickerMode = UIDatePicker.Mode.date
datePicker.addTarget(self, action: #selector(self.dateFieldModified(sender:)), for: UIControl.Event.valueChanged)
field.inputView = datePicker
}
}
Реализация нового класса DatePicker, который я написал выше, почти все работает: когда я нажимаю на текстовое поле "dateField", открывается окно выбора даты, и я могу прокрутить и выбрать дату.Однако после выбора даты ... поле dateField остается пустым.
Я новичок в Swift и ООП в целом, поэтому я уверен, что есть код или важная концепция, которую я упускаю.