ios objective-c uitableview ios8

ios - Deslizar para eliminar la celda hace que TableViewHeader se mueva con la celda



objective-c uitableview (7)

He encontrado un error extraño con mi tableViewHeader en mi UITableView en iOS 8. Al deslizar sobre una celda para revelar el botón Eliminar (paso de ratón a iOS estándar), mueve tableViewHeader junto con la celda que se está pasando. A medida que deslizo la celda, el encabezado se mueve de la misma manera que la celda que se pasa. No se mueven otras celdas en la vista de tabla, solo se desliza el encabezado y cualquier celda. He probado esto en iOS 7 no he encontrado el problema. Para mí, esto parece un error con tableViewHeader en iOS 8, ya que solo ocurre en esta versión y parece algo que nunca debería ocurrir. No veo ninguna razón para que el encabezado se incluya en deslizar para borrar.

A continuación solo hay una maqueta. Swipe-to-delete dentro de la aplicación es iOS predeterminado, nada personalizado.


Esto fue causado porque estaba usando una UITableViewCell como el encabezado de la tabla. Para resolver el problema de deslizamiento, en lugar de usar tableView.tableHeaderView = cell , uso lo siguiente:

UIView *cellView = [[UIView alloc] init]; [cellView addSubview:cell]; tableView.tableHeaderView = cellView

No sé por qué esto resuelve el problema, especialmente porque funcionó en iOS 7, pero parece resolver el problema.

Asegúrese de agregar todas las vistas a la vista de celdas, como se supone para las celdas contentView, de lo contrario, los botones no responderán.

Trabajos:

[cell addSubview:view]; o [self addSubview:view];

No funciona:

[cell.contentView addSubview:view] o [self.contentView addSubview:view]


Intente implementar este método y proporcione las condiciones adecuadas para verificar el deslizamiento. Si recibe este método, solicite la vista de encabezado.

1.tableView: editingStyleForRowAtIndexPath: 2.tableView: titleForDeleteConfirmationButtonForRowAtIndexPath: 3.tableView: shouldIndentWhileEditingRowAtIndexPath:


La cuestión de Victor de perder el color de fondo se resuelve por debajo de la respuesta de Brad:

cell.backgroundColor = UIColor.cyanColor()

A:

cell.contentView.backgroundColor = UIColor.cyanColor()


La forma de evitar que los encabezados se muevan con las celdas es devolver contentView de la celda en viewForHeaderInSection. Si tiene una UITableViewCell subclase llamada SectionHeaderTableViewCell, este es el código correcto:

-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { SectionHeaderTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SectionHeader"]; //Do stuff to configure your cell return cell.contentView; }


Sobre la base de la respuesta de Ferris, encontré la manera más fácil al usar una UITableViewCell ya que un encabezado de sección es para devolver el contentView de la celda en viewForHeaderInSection. El código es el siguiente:

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let cell : cellSectionHeader = tableView.dequeueReusableCellWithIdentifier("SectionHeader") as cellSectionHeader return cell.contentView //cellSectionHeader is my subclassed UITableViewCell }


Un problema que no se menciona con el método .contentView es que si su celda de vista de tabla hace uso de layoutSubviews, es posible que no obtenga el comportamiento que desea, porque layoutSubviews no se llamará. Terminé creando una subclase UIView completamente independiente que admite tanto el funcionamiento normal de la celda como el funcionamiento del encabezado, y la creación de una clase mínima de célula UITableView que usa eso.


SWIFT 3.0 Solución probada. Como se mencionó en el primer ejemplo para Objective-C; el punto clave es regresar cell.contentView en lugar de la celda. Entonces, la nueva sintaxis de formato es la siguiente.

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { // HeaderCell is the name of custom row designed in Storyboard->tableview->cell prototype let cell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell") cell.songLabel.text = "Your Section Name" return cell.contentView }