@G_r_i_n_v_i_c_h

Как правильно сделать форму в UITableView?

Друзья, пытаюсь сделать форму в 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
}
  • Вопрос задан
  • 177 просмотров
Пригласить эксперта
Ответы на вопрос 1
@dadduUrsa
Вернувшийся кодер недоучка
Добрый день!
Не совсем понятно, что вы хотите добиться. Я так понимаю это что типа таблицы в которой можно изменять данные?
Тогда зачем танцы с switch case? Сделайте модель, в ячейке через didSet обработку и тд.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы