Swift: recuperando texto de un UITextField en una UITableViewCell personalizada y poniéndolo en una matriz

Estoy haciendo una aplicación muy simple donde el usuario ingresa el número de personas en la primera pantalla.

En la segunda pantalla genera un número de UITableViewCell basado en el número que el usuario ingresó en la primera pantalla. El UITableViewCell tiene un UITextField en ellos y estoy tratando de almacenar los datos ingresados ​​en esos campos en una matriz una vez que el usuario hace clic para ir a la tercera pantalla.

¿Cómo puedo hacer eso?
¡Gracias por adelantado!

Editar: estoy usando el guión gráfico.

UITableViewCell es lo que el código que llama a la UITableViewCell personalizada se parece a mi UIViewController :

 func tableView(tableView:UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ var cell: EditingCell = tableView.dequeueReusableCellWithIdentifier("Cell") as EditingCell if indexPath.row % 2 == 0{ cell.backgroundColor = UIColor.purpleColor() } else { cell.backgroundColor = UIColor.orangeColor() } let person = arrayOfPeople[indexPath.row] cell.setCell(person.name) return cell } 

Aquí se muestra el código de UITableViewCell :

 class EditingCell: UITableViewCell{ @IBOutlet weak var nameInput: UITextField! override func awakeFromNib() { super.awakeFromNib() // Initialization code } override func setSelected(selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } func setCell(name:String){ self.nameInput.placeholder = name } } 

Hay un problema con su enfoque si el número de filas en su tabla excede el número que puede caber en la pantalla. En ese caso, las celdas que se desplazan fuera de la pantalla se reutilizarán y el contenido del nameInput textField se perderá. Si puede estar seguro de que esto nunca sucederá, use el siguiente código (en el método que maneja los toques de los botones) para componer su matriz:

  var arrayOfNames : [String] = [String]() for var i = 0; i 

Alternativamente....

Sin embargo, si es posible que las celdas se desplacen fuera de la pantalla, sugiero una solución diferente. Establezca el delegate para los campos de texto de nombre de entrada y luego use los métodos de delegado para captar los nombres a medida que se ingresan.

Primero, agregue variables a su controlador de vista, para mantener la matriz y el número de fila del campo de texto que se está editando actualmente.

  var arrayOfNames : [String] = [String]() var rowBeingEdited : Int? = nil 

Luego, en su método cellForRowAtIndexPath , agregue:

  cell.nameInput.text = "" // just in case cells are re-used, this clears the old value cell.nameInput.tag = indexPath.row cell.nameInput.delegate = self 

A continuación, agregue dos nuevas funciones, para captar cuando los campos de texto comienzan / finalizan la edición:

 func textFieldDidEndEditing(textField: UITextField) { let row = textField.tag if row >= arrayOfNames.count { for var addRow = arrayOfNames.count; addRow <= row; addRow++ { arrayOfNames.append("") // this adds blank rows in case the user skips rows } } arrayOfNames[row] = textField.text rowBeingEdited = nil } func textFieldDidBeginEditing(textField: UITextField) { rowBeingEdited = textField.tag } 

Cuando el usuario toca el botón, todavía pueden estar editando uno de los nombres. Para atender esto, agregue lo siguiente al método que maneja los toques de los botones:

  if let row = rowBeingEdited { let indexPath = NSIndexPath(forRow:row, inSection:0) let cell : EditingTableViewCell? = self.tableView.cellForRowAtIndexPath(indexPath) as EditingTableViewCell? cell?.nameTextField.resignFirstResponder() } 

Esto obliga a textField a completar la edición y, por lo tanto, desencadenar el método didEndEditing , con lo que se guarda el texto en la matriz.