¿Por qué el formateo de UITableView sale completamente mal cuando return de un controller de vista al que seguí?

Tengo una UITableView con una celda personalizada, que tiene unas pocas tags que deciden dinámicamente la altura de la celda. Cuando presiono en una celda y ajusto a un nuevo controller de vista, al devolver todo el formatting de las celdas está completamente desorderado, y no puedo determinar qué lo está causando.

Esto es lo que las celdas normalmente son:

introduzca la descripción de la imagen aquí

Y tengo algunas restricciones bastante básicas establecidas en ellos. La label superior está fijada a los márgenes superior e izquierdo, y siempre debe ser> = 20 desde la derecha. Las otras tags están alineadas a la izquierda de esta primera label, con un espacio vertical establecido entre todas ellas. La label del medio tiene una restricción de espacio derecha al margen, y las tags inferiores se alinean con la línea base del primero y tienen un espacio horizontal entre todas ellas.

Cuando return a esta vista de tabla, se ve así:

introduzca la descripción de la imagen aquí

No puedo entender qué lo está causando a la disposition de manera diferente a cuando me fui. Si me desploop alnetworkingedor, parece que los "reinicio" a lo que deberían ser, pero en la carga inicial están realmente en mal estado. Puedo adjuntar el proyecto si lo desea, pero realmente no hay mucho fuera del Storyboard.

cellForRowAtIndexPath:

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as CustomTableViewCell let object = objects[indexPath.row] cell.title1.text = object.name cell.title2.text = object.color cell.title3.text = object.roar return cell } 

Proyecto de muestra: http://cl.ly/040L2z0q0V2d

Parece que las celdas de vista de tabla no cambian de tamaño en function de los contenidos al regresar del segue. Usando el proyecto de ejemplo, lancé una recarga de datos en la vista WillAppear y eso pareció solucionar el problema.

 override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) self.tableView.reloadData() } 

En realidad hay un par de problemas con su proyecto.

Carga de datos y AutoLayout .

El primero está causando un comportamiento extraño en el momento de dibujar las celdas con datos. Cuando se deshaga de la segue, verá esas celdas adicionales en la parte superior de la tabla causadas por un cálculo de layout ambiguo.

Solución : mueva los datos a la override func viewWillAppear(animated: Bool) { y realice una tableView.reloadData() (como lo sugiere correctamente @rFessler) .

Por otro lado, Autolayout es una especie de bestia ardiente. Tamable Vale la pena investigar más el tema. No pude hacer que su layout funcione con la altura de la celda de autosificación, pero dejaré unas pocas references y el proyecto para usted.


Referencias:

http://www.appcoda.com/self-sizing-cells/

http://captechconsulting.com/blog/tyler-tillage/ios-8-tutorial-series-auto-sizing-table-cells


Proyecto: http://cl.ly/3z3a2Z3a3U2K

Yo mismo he tenido un problema similar. Descargué tu proyecto y parece que lo he solucionado eliminando y modificando algunas restricciones. Así son mis restricciones ahora:

introduzca la descripción de la imagen aquí

También he agregado esto a viewDidLoad:

 self.tableView.estimatedRowHeight = 120 self.tableView.rowHeight = UITableViewAutomaticDimension 

También agregué esto para probar eliminar:

 override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { if editingStyle == .Delete { self.objects.removeAtIndex(indexPath.row) self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) } } 

¡Ahora puedes incluso rotar el dispositivo y eliminar filas y todo funciona espléndidamente!


Sin embargo, todavía hay un problema si presiona esta vista en un controller de navigation (de qué se trataba mi problema al principio). Mira mi guión gráfico a continuación para get algunas tags funky:

introduzca la descripción de la imagen aquí

Para resolver esto, ¡parece que realmente tenemos que hacer un pirateo! (Maldita manzana, ¿qué pasa con esto ?!)

 var firstAppearance=true override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) if firstAppearance { if let indexPaths = self.tableView.indexPathsForVisibleRows() { self.tableView.reloadRowsAtIndexPaths(indexPaths, withRowAnimation: UITableViewRowAnimation.None) self.firstAppearance = false } } } 

Por el momento, creo que esto es tan bueno como es posible.

Jugué con esto y encontré una solución simple, agregar esto parece solucionar el problema.

 override func viewWillDisappear(animated:Bool) { super.viewWillDisappear(animated) self.tableView.estimatedRowHeight = 166.0 } 

Dado que el método tableView:estimatedHeightForRowAtIndexPath se llamará cada vez que acceda a un nuevo MVC y cambie la ejecución automática, puede hacer

 override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension } 

para reutilizar el autolayout