Друзья, пытаюсь сделать форму в UItableview. В процессе возникло несколько вопросов. Не уверен, что я в принципе подошел к вопросу с правильной стороны.
Есть простой кастомный cell:
class CreateUpdateCell: UITableViewCell {
static let reuseID = "CreateUpdateCell"
let imageField = UIImageView()
let textField = UITextField()
...
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
configure()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func set(image: UIImage, text: String) {
imageField.image = image
textField.placeholder = text
}
func configure() { ... }
}
В TableView делаю так:
extension ToolCreateVC: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 4
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: CreateUpdateCell.reuseID, for: indexPath) as! CreateUpdateCell
cell.textField.tag = indexPath.row
switch indexPath.row {
case 0:
cell.set(image: UIImage(systemName: "pencil")!, text: "Наименование")
cell.textField.addTarget(self, action: #selector(textFieldValueChanged), for: .editingChanged)
case 1:
cell.set(image: UIImage(systemName: "tray")!, text: "Инвентарный номер")
cell.textField.addTarget(self, action: #selector(textFieldValueChanged), for: .editingChanged)
case 2:
cell.set(image: UIImage(systemName: "calendar")!, text: "Дата приобретения")
cell.textField.inputView = buyDateDatePicker
buyDateDatePicker.textField = cell.textField
cell.textField.addTarget(self, action: #selector(textFieldValueChanged), for: .editingChanged)
case 3:
cell.set(image: UIImage(systemName: "pencil")!, text: "Комментарий")
cell.textField.addTarget(self, action: #selector(textFieldValueChanged), for: .editingChanged)
default:
break
}
return cell
}
@objc func textFieldValueChanged(sender: UITextField) {
guard let value = sender.text else { return }
switch sender.tag {
case 0:
tool.name = value
case 1:
tool.codeNumber = value
case 2:
tool.buyDate = value.convertToyyyyMMddFormat()
case 3:
tool.comment = value
default:
break
}
}
}
Несколько вопросов будет, ибо они схожи между собой и плодить темы, чтобы спросить каждый отдельное не вижу смысла.
Вопрос 1: для того, чтобы сохранить значение в создаваемую структуру, приходится каждому textField присваивать tag с номером indexPath.row, чтобы в обработчике textFieldValueChanged понять какой field собственно изменился + при каждом нажатии на кнопку я пишу новое значение в структуру. Решение это не очень нравится. Подскажите это норм решение или кривое и есть лучше?
Вопрос 2: Надо данные из buyDateDatePicker'a сохранить при .valueChanged в textField и структуру. Единственный вариант, который пришел в голову, создать дочерний класс к datePicker:
class customUIDatePicker: UIDatePicker {
var textField = UITextField()
}
И сделать примерно так:
buyDateDatePicker.addTarget(self, action: #selector(dateChanged), for: .valueChanged)
cell.textField.inputView = buyDateDatePicker
buyDateDatePicker.textField = cell.textField
@objc func dateChanged() {
buyDateDatePicker.textField.text = buyDateDatePicker.date.convertToddMMyy()
tool.buyDate = buyDateDatePicker.textField.text?.convertToyyyyMMddFormat()
}
Но опять же не уверен, что это не кривое решение.
Вопрос 3: Если я инициализирую tool, то без проблем могу потом менять отдельно каждую переменную. Если я делаю force unwrap, то объект вроде как nil и отдельно присваивать нельзя. Опять же возникает вопрос правильности решения. Как лучше, сохранять все значения в некий массив в процессе редактирования и потом разом на его основе создавать объект или создать пустой объект (не нравится, т.к. если у объекта много переменных, то это как-то убого выглядит) и менять каждую переменную отдельно?
class ToolCreateVC: UIViewController {
//1:
var tool: Tool = Tool(id: 0, name: "", codeNumber: nil, buyDate: nil, comment: nil, toolmove: nil)
//2:
var tool2: Tool!
// Но тогда не могу обратиться к переменным, например: tool2.name
}