отправить текстовое поле текст внутри табличного представления на внешнюю кнопку

#ios #swift #uitableview #delegates #textfield

#iOS #быстрый #uitableview #делегаты #текстовое поле

Вопрос:

У меня есть таблица с текстовым полем внутри нее. Я хочу отправить то, что вводит пользователь, нажав кнопку. Но кнопки нет внутри таблицы.

Поэтому я использовал эту простую функцию для передачи текста из текстового поля в эту переменную:

 extension TableViewCell: UITextFieldDelegate {    func textFieldDidChangeSelection(_ textField: UITextField) {    amountFromCell = textField.text!  print(amountFromCell)    }   }  

Я запустил код, и он печатает все, что я печатаю в текстовом поле в консоли. Но эта переменная, как вы можете видеть, определена в TableViewCell разделе «Не там, где присутствует кнопка». Поэтому я создал еще одну переменную amountFromCell в классе tableViewCell для хранения в ней данных.

И сделал что-то вроде этого :

 amountFromTable = cell.amountFromCell   return cell  

и, наконец, запустил этот код.., когда я нажимаю кнопку:

 @IBAction func btnPrintAmount(_ sender: UIButton) {  print(amountFromTable) }  

Но он возвращается пустым.

Поэтому я знаю, что у меня есть значение, amountFromcell но не уверен, добавляет ли его использование amountFromTable = cell.amountFromCell при возврате ячейки amountFromTable или нет.

Или, может amountFromTable = cell.amountFromCell быть, добавляет nil , когда ячейка создана, и она не получает последнее значение из текстового поля.

Я запутался, как отправить данные из этого текстового поля, которое находится внутри таблицы, в переменную, определенную вне TableView.

Ответ №1:

Ячейки табличного представления не тесно связаны с содержащими их табличными представлениями. Представление таблицы создает ячейки по мере необходимости, затем «помещает их в корзину», когда они прокручиваются за пределами экрана, и повторно использует их для отображения новой информации, когда новая ячейка прокручивается на экране.

Вы должны настроить свой код так, чтобы он собирал информацию из представлений в ячейке по мере ввода ее пользователем и сохранял ее в вашей модели данных. (Ввод текста, например). Если вы не соберете данные пользователя сразу, они могут быть потеряны, если пользователь прокрутит отредактированную ячейку за пределами экрана.

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

Вот один из них:

Создайте пользовательский подкласс UITableViewCell. Дайте ему свойство indexPath, чтобы он знал, какой позиции в модели принадлежат его данные.

Определите a CellDataDidChangeProtocol с помощью таких методов, как textDidChange(_:atIndexPath:) сообщение контроллеру представления о том, что пользователь ввел новые данные для ячейки (ввод текстового поля, настройки переключателя и т.д.) Дайте вашей ячейке свойство делегата, соответствующее этому протоколу.

В методе источника данных табличного представления cellForRow(at:) задайте путь к индексу ячейки и установите свойство делегата, указывающее на контроллер представления. Попросите контроллер представления реализовать протокол делегирования вашей ячейки.

Попросите ячейки представления таблицы обнаруживать ввод в своих текстовых полях и передавать обновленные данные своему делегату.

В контроллере представления, когда пользователь нажимает кнопку «Отправить», извлеките данные из модели и отправьте их туда, куда их необходимо отправить.