¿Mezcla UITableView de células estáticas y dinámicas?

Sé que no se pueden mezclar los tipos de células estáticas y dinámicas en una sola UITableView pero no se me ocurrió una mejor manera de describir mi problema.

Tengo varias celdas predeterminadas con contenido fijo, también tengo un número desconocido de celdas con contenido dynamic que se encuentra en el medio. Así que quiero que mi mesa se vea así:

 Fixed Fixed Fixed Dynamic Dynamic Dynamic Dynamic Dynamic Fixed Fixed 

Entonces, ¿cómo exactamente recomiendas abordar esto en mi método cellForRowAtIndexPath ?

Gracias.

Como dijiste, no puedes mezclar células estáticas y dinámicas. Sin embargo, lo que puede hacer es dividir el contenido en diferentes matrices de datos que corresponden a cada grupo. A continuación, divida la tabla en secciones de diferencias y cargue los datos de la matriz correcta en cellForRowAtIndexPath :.

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellID = @"CELLID"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath]; switch (indexPath.section) { case 0:{ cell.textLabel.text = self.arrayOfStaticThings1[indexPath.row]; }break; case 1:{ cell.textLabel.text = self.arrayOfDynamicThings[indexPath.row]; }break; case 2:{ cell.textLabel.text = self.arrayOfStaticThings2[indexPath.row]; }break; default: break; } return cell; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { switch (section) { case 0:{ return self.arrayOfStaticThings1.count; }break; case 1:{ return self.arrayOfDynamicThings.count; }break; case 2:{ return self.arrayOfStaticThings2.count; }break; default: return 0; break; } } 

Mejor y más fácil aún

1) Coloque dos vistas de contenedor en el encabezado y en el pie de página de un TableView dynamic 2) Asigne los TableView estáticos a estos contenedores y desactive la opción “Desplazamiento habilitado”

Por favor mira mi ilustración en https://stackoverflow.com/a/22524085/1537178

Mezcla de tablas dinámicas y estáticas en Storeboard

suraj k thomas, Echa un vistazo a esta estructura mía, y funciona perfectamente. @firecast No utilicé restricciones dentro de este proyecto, sin embargo, establecí la altura del contenedor en función de la altura de la vista de tabla del contenedor, así:

  ContainerViewController *containerVC = self.childViewControllers.firstObject; CGRect frame = self.containerView.frame; frame.origin.x = 0; frame.origin.y = 0; frame.size.width = self.tableView.frame.size.width; frame.size.height = containerVC.tableView.contentSize.height; self.containerView.frame = frame; [self.tableView setTableHeaderView:self.containerView]; 

Espero que esto ayude, avíseme si tiene alguna pregunta.

Después de luchar por 1 día, encontré la mejor solución

Actualizado para Swift 4

para el caso de la pregunta:

  1. Establecer secciones de tableView en 3

enter image description here

  1. Agregue una celda de tabla vacía en la segunda sección donde desee aplicar las celdas dinámicas, cambie el identificador de la celda como WiFiTableViewCell

  2. crea un nuevo archivo WiFiTableViewCell llamado WiFiTableViewCell

enter image description here

  1. registrar el Nib en la función ViewDidLoad en tableViewController

     tableView.register(UINib(nibName: "WiFiTableViewCell", bundle: nil), forCellReuseIdentifier: "WiFiTableViewCell") 
  2. agregue el siguiente código para usar tanto la celda dinámica como la estática

     override func numberOfSections(in tableView: UITableView) -> Int { return 3 } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if section == 1 { return self.dataSource.count //the datasource of the dynamic section } return super.tableView(tableView, numberOfRowsInSection: section) } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if indexPath.section == 1 { let cell = tableView.dequeueReusableCell(withIdentifier: "WiFiTableViewCell") as! WiFiTableViewCell return cell } return super.tableView(tableView, cellForRowAt: indexPath) } override func tableView(tableView: UITableView, indentationLevelForRowAtIndexPath indexPath: NSIndexPath) -> Int { if indexPath.section == 1 { let newIndexPath = IndexPath(row: 0, section: indexPath.section) return super.tableView(tableView, indentationLevelForRowAt: newIndexPath) } return super.tableView(tableView, indentationLevelForRowAt: indexPath) } override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { if indexPath.section == 1 { return 44 } return super.tableView(tableView, heightForRowAt: indexPath) }