uitableviewdatasource uitableviewcell example cocoa-touch uitableview

cocoa-touch - example - uitableviewcell lifecycle



UITableViewHeaderFooterView en InterfaceBuilder (7)

  1. crear una nueva vista en xib

  2. Cargar vista desde plumilla y establecer para ver como vista de pie de página a tabla vista

UIView * headerview = [[[NSBundle mainBundle] loadNibNamed: @ propietario de "ReguistrationHeaderView": self options: nil] firstObject]; [self.tableview setTableFooterView: headerview];

Quiero crear una vista de sección de encabezado personalizado en un .xib por separado utilizando IB

Sin embargo, en IB no puedo encontrar un componente UITableViewHeaderFooterView (similar a UITableViewCell) y asignarle una reutilización

Entonces, ¿cómo crear en la sección de encabezado personalizado?

Creo una clase MySection que hereda de UITableViewHeaderFooterView Cree un .xib, MySection.xib Registre xib para la reutilización de células

el problema es cómo usar el initWitReuseIdentifier ....


Es absolutamente posible y Apple proporciona un ejemplo here .

Descargue el código de muestra y mire en SectionHeaderView.xib.

La forma de hacerlo es crear un xib con una única UIView en él. Luego, establezca el tipo de clase en una clase que hereda de UITableViewHeaderFooterView.

Una vez que tenga un plumín con una clase que hereda de UITableViewHeaderFooterView, llame a lo siguiente para registrar la clase para reutilizarla como encabezado o pie de página:

static NSString * const SectionHeaderViewIdentifier = @"SectionHeaderViewIdentifier"; [self.tableView registerNib:[UINib nibWithNibName:@"SectionHeaderView" bundle:nil] forHeaderFooterViewReuseIdentifier:SectionHeaderViewIdentifier];

Para poner en práctica la vista, implemente el método delegado de mesa tableView: viewForHeaderInSection: así:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSinteger)section { SectionHeaderViewClass *sectionHeaderView = (SectionHeaderView *)[tableView dequeueReusableHeaderFooterViewWithIdentifier:SectionHeaderViewIdentifier]; // Do stuff... return sectionHeaderView; }


Es suficiente para crear una vista y asignar su clase en IB (no es necesario establecer el identificador de reutilización en el constructor de interfaz (como en una UITableViewCell personalizada))


He escrito una guide (probada en iOS 9), que consta de 4 pasos:

  1. Subclase UITableViewHeaderFooterView
  2. Cree Nib con la vista de subclase y agregue 1 vista de contenedor que contenga todas las demás vistas en el encabezado / pie de página
  3. En viewDidLoad , llama registerNib:forHeaderFooterViewReuseIdentifier: para la vista de tabla
  4. Implementa viewForHeaderInSection y utiliza dequeueReusableHeaderFooterViewWithIdentifier para recuperar el encabezado / pie de página

La documentación de UITableViewHeaderFooterView contiene registerNib:forHeaderFooterViewReuseIdentifier: method

Pero actualmente (a partir del 4 de septiembre de 2013) Object Library en Interface Builder no incluía un UITableViewHeaderFooterView. Esto hace que registerNib: forHeaderFooterViewReuseIdentifier: inútil, porque no hay forma de configurar la vista correctamente en el plumín. Tal vez es mejor intentar reutilizar la célula ...


Las siguientes soluciones me permiten arrastrar y asignar elementos IB al código como variables. UITableViewHeaderFooterView no permite eso fuera de la caja.

  1. crear un (New File / CocoaTouchClass) UITableViewHeaderFooterView .hmxib normalmente

  2. cambiar temporalmente el nombre de la superclase de UITableViewHeaderFooterView a UIView. Arrastre: asigne los elementos de su IU al código según sea necesario, IB asignará la clave-valor correctamente, volverá a UITableViewHeaderFooterView cuando haya terminado.

  3. en su vista de tabla, use registerNib: para registrarse en lugar de registerClass:. prepare el resto de la mesa normalmente (es decir, dequeue).

Siempre utilicé UITableViewCell como encabezados (o pies de página) para que mis tablas puedan editarlas directamente en el guión gráfico.

Mi flujo de trabajo:

  • Creo una clase MyHeaderTableViewCell subclassing UITableViewCell y agregando todas las salidas que necesito
  • Agrego una UITableViewCell a mi mesa en mi guión gráfico
  • Le doy un identificador de reutilización (es: "HeaderCell")
  • Dequeue la celda y uso su contenido como mi encabezado

La parte crucial es devolver el contentView de headerCell (no el headerCell en sí mismo), de lo contrario te encontrarás con comportamientos extraños cuando juegues con reloadRowsAt o funciones similares (desapareciendo los encabezados como máximo).

Este es mi código:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let headerCell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell") as! MyHeaderTableViewCell headerCell.lblTitle.text = "My Title" return headerCell.contentView }

Nunca tuve problemas para hacerlo (o al menos mis clientes siempre me pagaron).