На самом деле это то же решение, что и мое предложение в предыдущем вопросе.
Добавьте обратный вызов в ячейку и вызовите его, когда вызывается метод делегата текстового поля. Не забудьте подключить делегат текстового поля в Интерфейсном Разработчике.
И, пожалуйста, называйте классы и структуры всегда, начиная с заглавной буквы
class NameCell: UITableViewCell, UITextFieldDelegate {
@IBOutlet weak var nameText: UITextField!
var callback : ((UITableViewCell, String) -> Void)?
func textFieldDidEndEditing(_ textField: UITextField) {
callback?(self, nameText.text)
}
}
Если у вас более одной строки, вам нужно объявите массив источника данных, чтобы сохранить значения текстовых полей. Это пример для 4 строк
var values = ["", "", "", ""]
Это методы источника данных, в cellForRow
обратный вызов обновляет модель
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return values.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "nameCell", for: indexPath) as! NameCell
cell.nameText.text = values[indexPath.row]
cell.callback = { [unowned self] cCell, cName in
let currentIndexPath = tableView.indexPath(for: cCell)!
self.values[currentIndexPath.row] = cName
}
return cell
}
Преимущество заключается в том, что вы независимы от ячеек в методе clickSave
. Получите значения из массива источника данных. И вы можете передать имя как sender
параметр и передать его в prepare(for segue
@IBAction func clickSave(_ sender: UIBarButtonItem) {
let name = values[0]
performSegue(withIdentifier: "passData", sender: name)
}