uitableviewcell custom ios objective-c uitableview customization

ios - custom - table view cell swift 4



Expandir y contraer celdas de vista de tabla en ios (4)

Tengo una vista de tabla de celdas personalizadas y algunos botones en cada celda. Al hacer clic en cualquiera de los botones dentro de la celda, se mostrará otra vista personalizada debajo de esa celda. Hacer clic en el mismo botón colapsará la vista y necesita esto para todas las celdas Intenté con el método Insertrow en el clic del botón, pero fue en vano. ¿Cómo puedo hacer esto con solo usar los delegados de la vista de tabla?

Esto es lo que intenté:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *simpleTableIdentifier = @"CustomCell_For_Dashboard"; CustomCellFor_Dashboard *customCell = (CustomCellFor_Dashboard *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; if (customCell == nil) { NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCellFor_Dashboard" owner:self options:nil]; customCell = [nib objectAtIndex:0]; } [customCell.howyoulfeelBtn addTarget:self action:@selector(buttonclicked:) forControlEvents:UIControlEventTouchUpInside]; customCell.nameLabel.text = @"test"; customCell.imgView.image = [UIImage imageNamed:@"Default.png"]; // customCell.prepTimeLabel.text = [prepTime objectAtIndex:indexPath.row]; return customCell; } -(void)buttonclicked:(id)sender{ NSIndexPath *indexPath = [myTable indexPathForCell:sender]; [myTable beginUpdates]; NSIndexPath *insertPath = [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section]; [myTable insertRowsAtIndexPaths:[NSArray arrayWithObject:insertPath] withRowAnimation:UITableViewRowAnimationTop]; }

¿Alguien puede ayudarme?


Obtuve la misma tarea en un proyecto con solo una cosa diferente: no había botones, solo tocar en la celda se expandiría o colapsaría.

Hay varias cosas que debe editar en su código. Primero, el código del método del botón se verá más o menos así:

- (void) collapseExpandButtonTap:(id) sender { UIButton* aButton = (UIButton*)sender; //It''s actually a button NSIndexPath* aPath = [self indexPathForCellWithButtonTag:aButton.tag]; //Let''s assume that you have only one section and button tags directly correspond to rows of your cells. //expandedCells is a mutable set declared in your interface section or private class extensiont if ([expandedCells containsObject:aPath]) { [expandedCells removeObject:aPath]; } else { [expandedCells addObject:aPath]; } [myTableView beginEditing]; [myTableView endEditing]; //Yeah, that old trick to animate cell expand/collapse }

Ahora, lo segundo es el método UITableViewDelegate :

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if ([expandedCells containsObject:indexPath]) { return kExpandedCellHeight; //It''s not necessary a constant, though } else { return kNormalCellHeigh; //Again not necessary a constant } }

La clave aquí es determinar si su celda debe expandirse / colapsarse y devolver la altura correcta en el método de delegado.


Saliendo de lo que @ eagle.dan.1349 dijo, esta es la forma de hacerlo al hacer clic en la celda. En el guión gráfico, también debe configurar la celda de la tabla para las subvistas de los clips; de lo contrario, se mostrará el contenido que se ocultaría.

.h

@property (strong, nonatomic) NSMutableArray *expandedCells;

.metro

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if ([self.expandedCells containsObject:indexPath]) { [self.expandedCells removeObject:indexPath]; } else { [self.expandedCells addObject:indexPath]; } [tableView beginUpdates]; [tableView endUpdates]; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { CGFloat kExpandedCellHeight = 150; CGFloat kNormalCellHeigh = 50; if ([self.expandedCells containsObject:indexPath]) { return kExpandedCellHeight; //It''s not necessary a constant, though } else { return kNormalCellHeigh; //Again not necessary a constant } }


También tuve la misma situación y mi solución fue poner un botón sobre el título de la sección con el método viewForHeaderInSection .

noOfRows define cuántas filas hay en cada sección y botón. La button.tag mantiene qué botón de sección se presiona.

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIButton *btnSection = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, tableView.frame.size.height)]; btnSection.tag = section; [btnSection setTitle:[sectionArray objectAtIndex:section] forState:UIControlStateNormal]; [btnSection addTarget:self action:@selector(sectionButtonTapped:) forControlEvents:UIControlEventTouchUpInside]; return btnSection; } - (void)sectionButtonTapped:(UIButton *)button { sectionIndex = button.tag; if (button.tag == 0) { noOfRows = 3; } else if (button.tag == 1) { noOfRows = 1; } else if (button.tag == 2) { noOfRows = 2; } [self.tableView reloadData]; }

Espero que esto te ayudará..


Vi esta publicación y solo quería dar mis 2 centavos ya que mi solución para esto es muy similar a la respuesta elegida (el toque de un área completa).

Mucha gente lo hace usando solo células, pero creo que hay una forma de construir esto que se alinee mejor con lo que las personas intentan lograr:

Hay encabezados y hay celdas . Los encabezados deben ser tappables , y luego las celdas debajo de los encabezados se mostrarán u ocultarán . Esto se puede lograr agregando un reconocedor de gestos al encabezado, y cuando se toca, simplemente elimina todas las celdas debajo de ese encabezado (la sección) y viceversa (agrega celdas). Por supuesto, debe mantener el estado de los encabezados "abiertos" y qué encabezados están "cerrados".

Esto es bueno por un par de razones:

  1. El trabajo de los encabezados y las celdas está separado, lo que hace que el código sea más limpio.
  2. Este método fluye muy bien con la forma en que se construyen las vistas de tabla (encabezados y celdas) y, por lo tanto, no hay mucha magia: el código simplemente elimina o agrega celdas y debe ser compatible con las versiones posteriores de iOS.

Hice una biblioteca muy simple para lograr esto. Siempre que su vista de tabla esté configurada con las cabeceras y celdas de la sección UITableView, todo lo que tiene que hacer es crear una subclase de tabla y encabezado.

Enlace: https://github.com/fuzz-productions/FZAccordionTableView