Pregunta

En una aplicación en la que estoy trabajando, tengo un estilo simple UITableView que puede contener una sección que contiene cero filas. Quiero poder desplazarme a esta sección usando scrollToRowAtIndexPath: atScrollPosition: animated: pero obtengo un error cuando intento desplazarme a esta sección debido a la falta de filas secundarias.

La aplicación de calendario de Apple puede hacer esto, si mira su calendario en la vista de lista, y no hay eventos en su calendario para hoy, se inserta una sección vacía para hoy y puede desplazarse a ella usando el botón Hoy en la barra de herramientas en la parte inferior de la pantalla. Por lo que puedo decir, Apple puede estar usando un UITableView personalizado, o están usando una API privada ...

La única solución que se me ocurre es insertar un UITableCell vacío en una altura de 0 píxeles y desplazarse hasta eso. Pero tengo entendido que tener celdas de diferentes alturas es realmente malo para el rendimiento de desplazamiento. Aún así lo intentaré de todos modos, tal vez el éxito en el rendimiento no será tan malo.

Update

Dado que parece que no hay solución para esto, he presentado un informe de error con apple. Si esto también le afecta, presente un duplicado de rdar: // problem / 6263339 ( Abra el enlace de radar) si quieres que esto se solucione más rápido.

Actualización # 2

Tengo una solución decente para este problema, eche un vistazo a mi respuesta a continuación.

¿Fue útil?

Solución

ACTUALIZACIÓN: Parece que este error se corrigió en iOS 3.0. Puede usar el siguiente NSIndexPath para desplazarse a una sección que contiene 0 filas:

[NSIndexPath indexPathForRow:NSNotFound inSection:section]

Dejaré aquí mi solución original para cualquier persona que aún mantenga un proyecto utilizando el 2.x SDK.


Se encontró una solución decente:

CGRect sectionRect = [tableView rectForSection:indexOfSectionToScrollTo];
[tableView scrollRectToVisible:sectionRect animated:YES];

El código anterior desplazará la vista de tabla para que la sección deseada sea visible pero no necesariamente en la parte superior o inferior del área visible. Si desea desplazarse para que la sección esté en la parte superior, haga esto:

CGRect sectionRect = [tableView rectForSection:indexOfSectionToScrollTo];
sectionRect.size.height = tableView.frame.size.height;
[tableView scrollRectToVisible:sectionRect animated:YES];

Modificar secciónRect como desee para desplazar la sección deseada hacia la parte inferior o media del área visible.

Otros consejos

Esta es una pregunta antigua, pero Apple todavía no ha agregado nada que ayude o repare el error de bloqueo donde la sección no tiene filas.

Para mí, realmente necesitaba hacer que una nueva sección se desplazara hacia el centro cuando se agregara, así que ahora uso este código:

if (rowCount > 0) {
    [self.tableView scrollToRowAtIndexPath: [NSIndexPath indexPathForRow: 0 inSection: sectionIndexForNewFolder] 
                          atScrollPosition: UITableViewScrollPositionMiddle
                                  animated: TRUE];
} else { 
    CGRect sectionRect = [self.tableView rectForSection: sectionIndexForNewFolder];
    // Try to get a full-height rect which is centred on the sectionRect
    // This produces a very similar effect to UITableViewScrollPositionMiddle.
    CGFloat extraHeightToAdd = sectionRect.size.height - self.tableView.frame.size.height;
    sectionRect.origin.y -= extraHeightToAdd * 0.5f;
    sectionRect.size.height += extraHeightToAdd;
    [self.tableView scrollRectToVisible:sectionRect animated:YES];
}

Espero que les guste: se basa en el código de Mike Akers como pueden ver, pero hace el cálculo para desplazarse hacia el centro en lugar de hacia arriba. Gracias Mike, eres una estrella.

Un enfoque rápido para lo mismo:

if rows > 0 {
    let indexPath = IndexPath(row: 0, section: section)
    self.tableView.setContentOffset(CGPoint.zero, animated: true)
    self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
}

else {
    let sectionRect : CGRect = tableView.rect(forSection: section)
    tableView.scrollRectToVisible(sectionRect, animated: true)
}

Si su sección no tiene filas, use esto

let indexPath = IndexPath(row: NSNotFound, section: section)
tableView.scrollToRow(at: indexPath, at: .middle, animated: true)

Creo que una fila en blanco es probablemente la única forma de llegar allí. ¿Es posible rediseñar la interfaz de usuario de modo que el " vacío " fila puede mostrar algo útil?

Le digo que lo pruebe y vea cómo es el rendimiento. Dan advertencias bastante graves sobre el uso de sub-vistas transparentes en los elementos de su lista, y no encontré que importara tanto en mi aplicación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top