От ваших ячеек нельзя ожидать сохранения данных (содержимого вашего UITextField
), поскольку они удаляются из памяти, как только они выходят за видимые границы вашего табличного представления.
Вы должны заглянуть в протокол UITableViewDataSource
и сохранить содержимое UITextFields
вашей ячейки в классе, который останется в памяти на время контроллера представления табличного представления.
Как правило, люди используют контроллер представления в качестве источника данных, как и вы.
Шаги следующие:
- При инициализации контроллера представления создайте и подготовьте структуру данных (массив / словарь с ключами на IndexPaths), которая будет содержать содержимое нужного вам текста.для хранения
- При снятии очереди с ячейки (в вашей функции
cellForRowAt
) настройте ячейку с необходимой строкой из вашей структуры данных, если для этого конкретного indexPath существует содержимое. - Когда текстизменено пользователем в ячейке, уведомите источник данных о новом содержимом для пути индекса ячейки
Пример:
Определите следующий протокол:
protocol DataSourceUpdateDelegate: class {
func didUpdateDataIn(_ sender: UITableViewCell, with text: String?)
}
Убедитесь, что ваш UITableViewCell
объявляет переменную-делегат и использует ее:
class MyCell: UITableViewCell, UITextFieldDelegate {
@IBOutlet var myTextField: UITextField!
weak var dataSourceDelegate: DataSourceUpdateDelegate?
func configureCellWithData(_ data: String?, delegate: DataSourceUpdateDelegate?)
{
myTextField.text = data
myTextField.delegate = self
dataSourceDelegate = delegate
}
override func prepareForReuse() {
myTextField.text = ""
super.prepareForReuse()
}
func textFieldDidEndEditing(_ textField: UITextField) {
dataSourceDelegate?.didUpdateDataIn(self, with: textField.text)
}
}
Убедитесь, что ваш View Controller соответствует DataSourceUpdateDelegate
, и инициализируйте переменную для управления данными:
class MyViewController: UITableViewController, UITableViewDataSource, DataSourceUpdateDelegate {
var data = [IndexPath : String]()
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = MyCell() // Dequeue your cell here instead of instantiating it like this
let cellData = data[indexPath]
cell.configureCellWithData(cellData, delegate: self)
return cell
}
func didUpdateDataIn(_ sender: UITableViewCell, with text: String?) {
data[tableView.indexPath(for: sender)!] = text
}
}