ios objective-c uitableview autolayout viewwillappear

iOS 8: el texto detallado de UITableViewCell no se actualiza correctamente



objective-c autolayout (8)

Confirmando el problema con Xcode 6.3.2 (6D2105) OS X Yosemite 10.10.3 Me aseguré de que se asignara el valor correcto, aún la primera vez que no se muestra, la segunda vez se muestra. Cell.layoutSubviews () me pareció lógico, ya que parecía que la vista carecía de una actualización y la adición de layoutSubviews () hizo el truco.

tl; dr: ¿Puedo hacer que detailTextLabel tenga su tamaño actualizado por el sistema de diseño automático en iOS en un cambio de valor?

¿Alguien más ha tenido problemas con la etiqueta detailText dentro de un UITableViewCell desde iOS 8?

Tengo una tabla que tanto texto como detalle cadenas. Inicialmente, el texto de detalle es una cadena vacía (@ ""). Después de realizar un guión gráfico a una pantalla de edición, vuelvo con un nuevo valor para el texto detallado y lo actualizo. Intento volver a cargar la tabla en viewWillAppear para que el valor esté presente inmediatamente después de volver a la vista anterior.

Una vez que la vista de la tabla vuelve a estar visible, la celda de la tabla ha desplazado el campo de texto hacia arriba para dejar espacio para el texto detallado, pero no se muestra ningún texto detallado. El texto no se muestra hasta que vuelvo a la pantalla de edición y vuelvo por segunda vez.

Lo que he hecho para solucionar el problema: Parece que el diseño automático de la etiqueta de texto de detalle no se actualiza correctamente como creo que debería, y el registro del tamaño y la composición del marco detailTextLabel lo confirma.

Soy capaz de forzar la actualización del texto ejecutando [table reloadData] en viewDidAppear, sin embargo, eso me deja con un efecto de flicker que no me gusta y parece poco profesional.

Edición: cosas adicionales que he hecho: también he forzado a detailTextLabel a redimensionarse usando [cell.detailTextLabel sizeToFit]. Esto hace que se muestre, pero se desplace de forma extraña en la celda. Después de volver a la página de edición, la detailTextLabel corrige su posición.

He creado un proyecto simple como un repositorio github, para mostrar exactamente con lo que estoy tratando:

https://github.com/acidaris/ios8_table_issue

El código principal del controlador de vista que estoy usando también está abajo.

- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.table reloadData]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 1; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"]; cell.textLabel.text = @"This is a test"; cell.detailTextLabel.text = self.value; CGRect frame = cell.detailTextLabel.frame; NSLog(@"detailTextLabel x=%f y=%f width=%f height=%f", frame.origin.x,frame.origin.y,frame.size.width,frame.size.height); return cell; }

La celda está prototipada dentro de un StoryBoard y, por lo tanto, la celda seleccionada por dequeueReusableCellWithIdentifier: siempre está definida. Además, el tipo de celda dentro del guión gráfico se establece en subtítulos, y se muestra si se define el valor inicial.

Si alguien pudiera ayudarme a resolver esto, estaría increíblemente agradecido.

Solucion parcial

Si está sub-clasificando UITableViewCell, puede modificar el marco para la etiqueta de detalles cuando se realiza el diseño. Esto es lo que he hecho, y parece haber funcionado, pero en la ventaja 6, obtengo una extraña línea divisoria entre la etiqueta de texto y la etiqueta de detalle. Edición: (Me he adaptado a esto). No me gusta esta solución, pero hasta ahora es la mejor que he encontrado. No se actualiza después de presentar la vista, y es relativamente simple. Como dije anteriormente, continuaré buscando una mejor solución.

- (void)layoutSubviews { [super layoutSubviews]; CGRect textFrame = self.textLabel.frame; [self.detailTextLabel sizeToFit]; CGFloat x = textFrame.origin.x; CGFloat y = textFrame.origin.y + textFrame.size.height; CGSize detailSize = self.detailTextLabel.frame.size; CGRect newFrame = CGRectMake(x, y, detailSize.width, detailSize.height); self.detailTextLabel.frame = newFrame; }

También actualicé mi proyecto Github para reflejar mi solución actual. Edit3: Esto no funciona a la perfección, ya que tiene valores incorrectos para los marcos de diseño verdaderamente automáticos, pero funciona para mis usos por el momento.

Edición 4: He actualizado mi función layoutSubviews para ser más inteligente. Tendrá el tamaño necesario para fijar el contenido dentro de la etiqueta y ubicará la etiqueta adecuadamente dentro de las coordenadas x / y en relación con la etiqueta del texto.


Creo que si necesita volver a cargarData, eso significa que los datos de la tabla no se cargan cuando se crean.

Solo necesita cargar sus datos en la vista de descarga (o en otro lugar ANTES de que la vista de tabla obtenga sus datos) donde se encuentra su vista de tabla, y luego crear las celdas correspondientes.

Por lo general, solo uso una matriz de cualquier objeto que esté usando y luego uso [array objectAtIndex:indexpath.row] , que probablemente conozca.

Además, el párrafo anterior tiene una oración sin terminar que parece importante.


Por lo tanto, seguí esta huella y muchos otros Este me llevó a lo que parece ser la respuesta correcta. Espero que esto ayude a otros, ya que esto me ha vuelto loco desde que iOS 7/8 realizó algún tipo de cambio.

Mi respuesta fue poner el código de procesamiento normal en viewWillAppear y agregar este [self.tableview layoutSubviews] en lugar de [self.tableView recargar datos]. Creo que esto tiene que ver con que Apple haga las cosas mucho más controlables en iOS 7 / 8. Me topé con esa idea al revisar cierta información sobre cómo funcionaban las células.

Una vez más, espero que esto ayude a otros a resolver este problema molesto.


Tengo el mismo problema con la celda que no se actualiza correctamente cuando uso segue en el guión gráfico. Intentó

[setNeedsLayout] and [layoutIfNeeded]

en la vista y el tableview y NO está funcionando.

[self.tableView reloadData] is in viewDidAppear, as it should.

Entonces probé el consejo de pixbug, y funcionó. Pero uno NO debe usar [layoutSubviews] directamente. Así que probé los que son advertidos por los documentos en la celda en lugar de tableView o la vista.

Intentó

[cell setNeedsLayout]

pero esto no funciono.

Intentó

[cell layoutIfNeeded]

esto funciono para mi

Pongo esto antes de devolver la celda.


Tengo el mismo problema. Tengo la certeza de que los datos están disponibles y que están asignados a cell.detailTextLabel.text. He notado que una vez que se asigna un valor, no hay parpadeo si el valor se cambia en el retorno a tableView. Entonces me parece que solo hay un problema en la primera asignación de un valor a la etiqueta de detalle.


Teniendo el mismo problema. Mi solución fue llamar a [cell layoutSubviews] antes de devolver la celda al final de -tableView:cellFForRowAtIndexPath . Esto me funciona, y no me pareció necesario anular layoutSubviews en la subclase de celda.


Tuve el mismo problema en un storyboard de iOS 8 (sin el diseño automático habilitado).

Tenía una vista de tabla con una celda de vista de tabla estática en la parte inferior. En IB, agregué algunos espacios en el área de contenido de esa celda de la tabla (Estilo: "Detalle a la derecha"). Luego, en el código (ViewDidLoad), actualicé el contenido de esa celda con ...

self.copyrightsCell.detailTextLabel.text = @"<a string>";

SIN los espacios IB, la celda era INVISIBLE en modo retrato.

Pero CON los espacios iniciales, el contenido de la celda luego aparece correctamente.

Espero que esto ayude a alguien.


Tuve un problema similar con un UITableView estático. Cambio el texto de una etiqueta y no se actualiza en la pantalla a menos que haga clic en la celda o haga algo para forzar la actualización de sus vistas. Mi solución fue llamar después de actualizar el texto:

tableView.reloadData()

PS Esto no tiene ningún sentido; porque esta es una vista de tabla estática, y no sé por qué funcionó, ¡pero lo hizo!