Как сохранить текст в текстовом поле в Swift? - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть табличное представление, состоящее из 2 ячеек, и у каждой ячейки есть текстовое поле. Я хотел бы сохранить текст в текстовом поле в другой переменной и добавить его в массив, но он просто сохраняет текстовое поле второй ячейки в переменную и не добавляет массив.

Вот код cellForRowAt:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if tableView == queryTableView {
            let cell = tableView.dequeueReusableCell(withIdentifier: queryCellReuseIdentifier,
                                                   for: indexPath) as! queryCell

            cell.selectionStyle = UITableViewCell.SelectionStyle.gray

            queryTextField = UITextField(frame: CGRect(x: 20, y: 0, width: 300, height: 20))
            queryTextField.delegate = self
            queryTextField.placeholder = "Soruyu buraya giriniz"
            queryTextField.font = UIFont.systemFont(ofSize: 15)
            cell.addSubview(queryTextField)

            return cell

        }

Вот моя связанная функция:


  func textFieldDidEndEditing(_ textField: UITextField) {
        var temp = queryTextField.text!
        queryArray.append(temp)

        print(temp)

    }

1 Ответ

0 голосов
/ 01 ноября 2019

Кажется, что у вас есть независимая переменная queryTextField, которая переопределяется при создании второй ячейки.

Кроме того, в textFieldDidEndEditing попробуйте получить доступ к textField вместо queryTextField, например так:

func textFieldDidEndEditing(_ textField: UITextField) {
     var temp = textField.text!
     queryArray.append(temp)

     print(temp)
}

Отвечая на это:

Мне нужно, чтобы у каждой ячейки было свое текстовое поле, и я должен иметь возможность сохранять их тексты в массив. После этого я собираюсь отправить их на веб-сервис. Подводя итог, они будут моими параметрами.

  1. Вам не нужно иметь глобальный queryTextField только для этого. Вы можете удалить эту переменную, если это ее единственная цель.
  2. Вам нужно отправить веб-запрос по какому-то триггеру? Как кнопка нажмите. Полагаю, да.
  3. Поскольку теоретически не все ваши ячейки видны одновременно (например, когда они не умещаются на экране), плохая идея пытаться отслеживать текст в текстовых полях. Вместо этого вам нужна какая-то модель для хранения всех текстов (возможно, в паре с индексу). Простейшим был бы словарь, в котором ключ - это идентификатор ячейки (например, indexPath), а значение - это текст.
  4. В textFieldDidEndEditing вы можете сообщить об изменениях в контроллер представления. Для этого вам нужно назначить ячейку в качестве делегата для ее текстового поля. И просмотр контроллера - как делегата для ячейки. В textFieldDidEndEditing ячейка будет вызывать метод делегата контроллера представления, чтобы сообщить об изменении текста, передавая (например) self и текст в качестве параметров. Затем контроллер представления сможет найти свой индексный путь и сохранить текст в модели (словарь).
  5. По триггеру (нажатие кнопки?) Контроллер представления сможет создавать параметры из модели (словарь).

Рассматривать этот псевдокод как направление:

cellForRow {
  ...
  cell = ...
  let textField = ...
  textField.delegate = cell
  cell.addSubview(textField)
  cell.delegate = self
}

В ячейке:

textFieldDidEndEditing(textField: UITextField) {
  delegate?.report(text: textField.text ?? "", in: self)
}

В поле зрения контроллера:

report(text: String, in cell: UITableViewCell) {
  let indexPath = tableView.indexPath(of: cell)
  model[indexPath] = text
}
...