Problema al realizar una segue en una celda de vista de tabla

Actualmente estoy aprendiendo Swift y estoy tratando de realizar un segue cuando el usuario toca una de las celdas de tableview que presenta la aplicación. En este momento, cada vez que el usuario realiza esta acción, el siguiente controller de vista se carga con éxito, pero parece que, por alguna razón, no puedo acceder a ninguno de sus elementos de interfaz de usuario, ya que cada vez que trato de hacerlo, termino obteniendo este error:

error fatal: inesperadamente encontrado nulo mientras desenvuelve un valor opcional

El error apunta a la línea en la que trato de modificar el text de una de las tags que se muestran en el siguiente controller de vista

Esta es la function didSelectRowAt :

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){ self.performSegue(withIdentifier: "segue1", sender: self) } 

y esta es la function prepareForSegue :

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "segue1" { let destinationVC = segue.destination as! UserViewController let selectedRow = tableView.indexPathForSelectedRow! let selectedCell = tableView.cellForRow(at: selectedRow) as! CustomCell destinationVC.usernameLabel.text = selectedCell.userName.text //this is where the error is pointing to destinationVC.bioLabel.text = selectedCell.bio.text destinationVC.userImage.image = selectedCell.photo.image } } 

No tengo idea de qué está causando este problema. Mi objective es pasar los datos de la celda tocada al siguiente controller de vista, pero obviamente esto me impide hacerlo. ¿Alguien sabe cómo puedo arreglar esto? Gracias por adelantado.

Nota: asumí que userName y bio eran tanto UITextField s

¿Por qué no intentas algo así?

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "segue1" { let destination = segue.destination as! UserViewController // Use of optional binding to make sure an indexPath exists if let indexPath = tableView.indexPathForSelectedRow { let cell = tableView.cellForRow(at: IndexPath(row: indexPath.row, section: indexPath.section)) as! CustomCell // Notice how we are not directly updating the label as before. destination.usernameText = cell.userName?.text destination.bioText = cell.bio?.text } } } 

Ahora en UserViewController :

 @IBOutlet weak var usernameLabel: UILabel! @IBOutlet weak var bioLabel: UILabel! // What we will be passing the text to instead. var usernameText: String? var bioText: String? 

 override func viewDidLoad() { super.viewDidLoad() // update the labels with the text from the proper cell. usernameLabel?.text = usernameText bioLabel?.text = bioText } 

Puede hacer lo mismo para su image, solo diferentes types. Esto tiene que ver con los puntos de venta que no se asignan cuando se usan en prepare(for segue:) .

Tuve un gran problema con el método de preparación para segue al intentar lo mismo con UICollectionView. Los 2 son muy similares por lo que debería poder cambiar collectionview a tableview fácilmente.

esto es lo que hice … usar variable selectedPack

En el controller de vista que desea seguir, debe establecer la variable

 // passed packName from PackViewController var selectedPack: String! 

entonces en el control de vista está seleccionando la celda

 public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { // handle the segue to JourneyViewController with variable "selectedPack" // not sure why you need to set the storyboard but it works let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil) //create instance of the viewcontroller let transportJourneyViewController = storyBoard.instantiateViewController(withIdentifier: "JourneyViewController") as! JourneyViewController //value to pass - has been defined in journey transportJourneyViewController.selectedPack = INSERT_YOUR_VALUE_TO_PASS //present the vc self.present(transportJourneyViewController, animated:true, completion:nil) } 

JourneyViewController es el storyboardID y ClassName del viewcontroller al que quiere ir.set en el generador de interfaces.

También necesitará tener tableviewdatasource y tableviewdelegate definidos en el nivel superior de sus controlleres de vista y en el propio guión gráfico.

 class JourneyViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {