¿Cambiar la altura de un UITableViewCell estático solo es posible anulando heightForRowAtIndexPath?

He examinado muchos ejemplos de cómo esconder un UITableViewCell estático invalidando heightForRowAtIndexPath , y mientras lo tengo funcionando parece tan engorroso que me gustaría ver si estoy haciendo algo mal.

Tengo un UITableViewController con una vista de tabla que tiene aproximadamente 8 filas. Esta pantalla de mi aplicación muestra un solo object, por ejemplo, una fila es una descripción, una es una image, una contiene una vista de map, etc. Todas las filas son estáticas.

En algunos casos, algunos de los objects que se muestran no tienen un map, así que quiero ocultar la fila que contiene la vista de mapview . Dado que es una fila estática, pensé que al tener una propiedad de salida para esa fila (por ejemplo, @property (weak, nonatomic) IBOutlet UITableViewCell *mapViewRow; ), entonces podría de alguna manera establecer el alto de esa fila a 0 u ocultar esa fila en viewDidLoad o viewWillAppear Sin embargo, parece que la única forma de hacerlo es anular el método heightForRowAtIndexPath , que es un poco molesto porque entonces necesito codificar el índice de la fila del map en mi código, por ejemplo

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.row == 6 && self.displayItem.shouldHideMap) { return 0; } return [super tableView:tableView heightForRowAtIndexPath:indexPath]; } 

Por supuesto, no es gran cosa, pero la forma de dimensionar las filas estáticas en una vista de tableview parece derrotar el punto de configurarlas en el guión gráfico en primer lugar.

EDITAR : justificación detrás de mi respuesta

Para cambiar la altura de una fila, debe volver a cargar la tabla completa o un subset que contenga esa fila. B / c es un poco extraño tener una fila en la tabla con cero altura, prefiero modificar su fuente de datos de tal manera que la fila no exista en la tabla.

Hay varias forms de hacerlo. Puede crear una matriz desde su displayItem donde cada fila de la matriz corresponde a una fila en la tabla con los datos apropiados. Rebuildá esta matriz y luego llamará [tableView reloadData] . Mi respuesta original también eliminaría la fila no deseada al tratar cada elemento de datos como una sección con 0 o 1 filas.

RESPUESTA ORIGINAL

¿Tu table es un estilo simple o agrupado? Si es un estilo simple, podría tratar cada fila como una sección con 0 o 1 filas en ella. En sus methods tableView dataSource y delegate, usaría el índice de sección para identificar los datos dentro de self.displayItem que le interesan para esa sección.

Tu código sería algo así como:

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 8; // max number of possible rows in table } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { NSInteger rows = 1; // set self.mapSectionIndex during initialization or hard code it if (section == self.mapSectionIndex && self.displayItem.shouldHideMap) { rows = 0; } return rows; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:indexPath { return 60.0f; // whatever you want the height to be } // also modify tableView:cellForRowAtIndexPath: and any other tableView delegate and dataSource methods appropriately 

puede anular heightForRowAtIndexPath y simplemente escribir en él, return UITableViewAutomaticDimension; Esto hará que la celda calcule la altura automáticamente ya que la altura de UILabel es> =. me funcionó