2011-12-28 18 views
16

Tengo un UITableView con algunas secciones, cada una tiene su propia vista de encabezado. Cuando el usuario toca en la vista de encabezado de una sección, todas las filas de esa sección colapsarán. Lo que hago es, fijo el número de fila de esa sección a 0, y luego llamar a:UITableView reloadSections/reloadData: la vista de encabezado se vuelve vacía

[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationBottom]; 

Todo funciona como se esperaba, excepto una cosa: la vista de encabezamiento de la sección se queda en blanco blanco. Cuando desplazo la tabla, el encabezado vuelve a ser normal.

Así que supongo que hay algún problema con el dibujo de la tabla.

Una cosa graciosa es que, si utilizo UITableViewRowAnimationFade en su lugar, incluso cuando me desplazo por la tabla, el encabezado sigue siendo blanco en blanco.

Cuando actualizo solo UNA sección, tampoco hay ningún problema: cuando actualizo más de una sección, se produce el problema.

si uso

[self.tableView reloadData] 

lugar, entonces todo funciona bien.

La razón por la que el uso

[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationBottom]; 

es porque quiero animación.

Envolviendo con beginUpdates/endupdates no funciona.

Respuesta

1

Encontré una solución temporal, no muy elegante, pero funciona. En lugar de proporcionar un NSIndexSet con más de una sección, llamo a reloadSections dentro de un for-loop con solo una sección en cada llamada.

parece:

for (Element *eleSection in self.gruppenKoepfe) { 
     if (eleSection.type.integerValue == qmObjectTypeFormularSpalte || eleSection.type.integerValue == qmObjectTypeFormularZeile) { 
      [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:nCount] withRowAnimation:UITableViewRowAnimationFade]; 
     } 
     nCount ++; 
    }  
0

que estaba teniendo un problema similar, excepto que estaba tratando de eliminar/secciones de inserción, y me encontré con que el mantenimiento de una fuerte propiedad que apunta a la vista de toda la cabecera (es decir, no sólo una subvista) dejó de desaparecer durante las actualizaciones de la sección.

p. Ej. Propiedad y creación de instancias

@property (nonatomic, strong) UIView *headerView;

-(UIView *)headerView { 
    if (!_headerView) { 
    _headerView = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.view.bounds.size.width, 300)]; 
    // add additional view setup, including subviews 
    } 
    return _headerView; 
} 

Y en tableView:(UITableView *)viewForHeaderInSection:(NSInteger)section:

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    if (section == theCorrectSection) { 
     return self.headerView; 
    } 
    return nil; 
} 
33

me di cuenta que se trata de un largo tiempo ya que esta pregunta fue planteada pero creo que todas las respuestas dadas a continuación son incorrectos.

Tuve el mismo problema (con el código de otra persona) y estaba a punto de dejarme engañar por esta publicación cuando me di cuenta de que el código no estaba haciendo correctamente la reutilización del encabezado de la tabla. La cabecera que desapareció se debió a que el código solo estaba suministrando una UIView, no una UITableViewHeaderFooterView, registrada correctamente y configurada para su reutilización.

Tener un vistazo a la respuesta aquí: How to use UITableViewHeaderFooterView?

Los encabezados en blanco se fueron al configurar un encabezado reutilizable.

+1

Esta debe ser la respuesta correcta. ¡Gracias! :) – RJiryes

+0

Buena captura - parece tan obvio ahora ... :) – NSTJ

+0

No hay una respuesta aceptada en esa pregunta. ¿Cuál es el que debe seguir? – GeneCode

0

Tuve el mismo problema y no fue ninguna de las anteriores. Mi problema era que estaba ocultando el primer encabezado y, por alguna razón, después de más de 10 recargas, el encabezado en el índice 2 estaba oculto. Cuando configuré headerView.hidden = false, estaba bien.

1

En Swift:

Es necesario crear una clase que es una subclase de UITableViewHeaderFooterView y registrarlo en la vista de tabla. Luego, en viewForHeaderInSection, haga let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "HeaderView") as! YourHeaderView, similar a lo que hace para UITableViewCells. A continuación, devuelva ese header.

Lo engañoso es la función pide la vuelta de UIView? cuando realmente necesita un dequeuedReusableHeaderFooterView o reloadData provocará que desaparezca

+0

¿Podría proporcionar un fragmento de código para esto? He estado luchando con este tema durante varios días y eres el único que sugiere este enfoque (que creo que es el correcto) –

+0

Me olvidé de decir por favor –

Cuestiones relacionadas