El encabezado de la sección UITableView desaparece si inserto o elimino filas.

Tengo una UITableView con 4 secciones. Tres de estas secciones tienen una vista de encabezado.

La vista de encabezado es una UITableViewCell , que dejo en queue como una célula normal en viewForHeaderInSection: delegate.

Si inserto o elimino una fila de cualquier sección, desaparecerán las demás tableview encabezado de la tableview .

Estoy asumiendo que esto tiene algo que ver con la reutilización de la celda, sin embargo, las celdas inicialmente aparecen todas en la pantalla (los tres encabezados aparecen en la pantalla al mismo time).

Intenté volver a cargar las otras secciones después de insert o eliminar, pero eso no ayuda.

Aquí hay un código:

 - (UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { switch (section) { case kSectionCardInformation: case kSectionContactInformation: case kSectionTags: { static NSString *CellIdentifier = @"EditContactHeaderCell"; EditContactHeaderCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; return cell; } default: return nil; } } 

Y aquí es donde elimino la fila en la sección de revelado:

 - (void)deleteTag:(CDTag *)tag { [self.tableView beginUpdates]; NSMutableArray *objects = [self.sections objectAtIndex:kSectionTags]; if ([objects containsObject:tag]) { NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[objects indexOfObject:tag] inSection:kSectionTags]; [objects removeObject:tag]; [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationMiddle]; [self.contact deleteTag:tag]; } [self.tableView endUpdates]; } 

Cualquier ayuda, muy apreciada.

Simplemente envuelva su UITableViewCell en una UIView.

 - (UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { switch (section) { case kSectionCardInformation: case kSectionContactInformation: case kSectionTags: { static NSString *CellIdentifier = @"EditContactHeaderCell"; EditContactHeaderCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; UIView * view = [[[UIView alloc] init] autorelease]; [view addSubview:cell]; //setup the view's frame: fixed, autolayout, ... return view; } default: return nil; } 

}

Agregando comentarios desde que tuve el mismo problema … El problema era que yo también estaba usando un UITableViewCell como encabezado en lugar de usar un UITableViewHeaderFooterView.

Arreglar el problema:

  1. Cree un file de nib y haga su encabezado personalizado allí en lugar de dentro de UITableView en su storyboard.
  2. Vinculelo a su class UITableViewHeaderFooterView personalizada
  3. Registra esta punta dentro de tu function viewDidLoad

     override func viewDidLoad() { self.tableView.rowHeight = UITableViewAutomaticDimension self.tableView.register(UINib(nibName: "NibFileName", bundle: nil), forHeaderFooterViewReuseIdentifier: "CustomViewHeaderView") } 
  4. Dequeue su HeaderFooterView reutilizable desde la function viewForHeaderInSection:

     func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let cell = tableView.dequeueReusableHeaderFooterView(withIdentifier:"CustomViewHeaderView") as! CustomViewHeaderView return cell } 

Esto solucionó mi encabezado desaparecido. Espero que pueda ayudar a otros.

No sé por qué estás utilizando tableview cell para encabezado, pero mi suposition es que

Te has perdido la statement de descanso.

 - (UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { switch (section) { case kSectionCardInformation: break; case kSectionContactInformation: break; case kSectionTags: { static NSString *CellIdentifier = @"EditContactHeaderCell"; EditContactHeaderCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; return cell; } default: return nil; } } 

Compruebe la condición de nil antes de devolver la celda, si no fue cero, cree la celda.

  static NSString *CellIdentifier = @"EditContactHeaderCell"; EditContactHeaderCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; return cell ?: createdCellNewly; 

Actualizaciones:

Luego, revise su número de numberOfSectionsInTableView:(UITableView *)tableView método numberOfSectionsInTableView:(UITableView *)tableView devuelve el recuento adecuado.

  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // returning count is correct? } 

Verifique y configure el delegado y la fuente de datos de tableview.