Swift: récupérer du text d'un UITextField dans un UITableViewCell personnalisé et le placer dans un tableau

Je fais une application très simple où l'user entre le nombre de personnes dans le premier écran.

Dans le second écran, il génère un nombre de UITableViewCell basé sur le nombre que l'user a entré dans le premier écran. UITableViewCell a un UITextField en eux et j'essaye de stocker datatables inputs dans ces champs dans un tableau une fois que l'user clique pour aller au troisième écran.

Comment puis je faire ça?
Merci d'avance!

Edit: J'utilise le storyboard.

Voici à quoi ressemble le code qui appelle la fonction UITableViewCell personnalisée pour mon 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 } 

Voici à quoi ressemble le code 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:Ssortingng){ self.nameInput.placeholder = name } } 

Il y a un problème avec votre approche si le nombre de lignes dans votre table dépasse le nombre qui peut s'adapter à l'écran. Dans ce cas, les cellules qui défilent hors écran seront réutilisées et le contenu de nameInput textField sera perdu. Si vous pouvez être sûr que cela n'arrivera jamais, utilisez le code suivant (dans la méthode qui gère les buttons) pour composer votre tableau:

  var arrayOfNames : [Ssortingng] = [Ssortingng]() for var i = 0; i<self.arrayOfPeople.count; i++ { let indexPath = NSIndexPath(forRow:i, inSection:0) let cell : EditingCell? = self.tableView.cellForRowAtIndexPath(indexPath) as EditingCell? if let item = cell?.nameInput.text { arrayOfNames.append(item) } } println("\(arrayOfNames)") 

Alternativement ….

Cependant, s'il est possible que les cellules défilent hors écran, je suggère une solution différente. Définissez le delegate pour les nameInput text nameInput , puis utilisez les methods delegate pour saisir les noms au fur et à mesure qu'ils sont entrés.

Tout d'abord, ajoutez des variables à votre controller de vue, pour contenir le tableau et le numéro de ligne du champ de text en cours d'édition.

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

Ensuite, dans votre méthode cellForRowAtIndexPath , ajoutez:

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

Ensuite, ajoutez deux nouvelles fonctions, à attraper lorsque les champs de text commencent / fin d'édition:

 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 } 

Lorsque l'user appuie sur le button, il se peut qu'il modifie encore l'un des noms. Pour répondre à cela, ajoutez ce qui suit à la méthode qui gère les touches du button:

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

Cela force textField à terminer l'édition, et donc triggersr la méthode didEndEditing , enregistrant ainsi le text dans le tableau.