uitableviewcell source number example data iphone cocoa-touch scroll

iphone - source - ¿Cómo desplazo un UITableView a una sección que no contiene filas?



uitableviewcell swift 3 (3)

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 me sale un error cuando trato de 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 una UITableView personalizada, o están usando una API privada ...

La única solución que puedo pensar es insertar un UITableCell vacío en que tiene 0 píxeles de alto y desplazarse a eso. Pero tengo entendido que tener celdas de diferentes alturas es realmente malo para el rendimiento de desplazamiento. De todos modos lo intentaré de todos modos, tal vez el rendimiento no sea tan malo.

Actualizar

Como 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 ( enlace Open Radar) si desea 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.


Creo que una fila en blanco es probablemente la única manera de ir allí. ¿Es posible rediseñar la interfaz de usuario de modo que la fila "vacía" pueda mostrar algo útil?

Yo digo que lo pruebes y veas cómo es el rendimiento. Dan advertencias bastante terribles sobre el uso de subvistas transparentes en los elementos de la lista, y no encontré que importara tanto en mi aplicación.


Esta es una vieja pregunta, pero Apple aún no ha agregado nada que ayude o solucione 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 agrega, 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 te guste, está basado en el código de Mike Akers como puedes ver, pero hace el cálculo para desplazarte hacia el centro en lugar de hacia arriba. Gracias Mike, eres una estrella.


ACTUALIZACIÓN: Parece que este error está solucionado 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é mi solución original aquí para cualquier persona que aún mantenga un proyecto utilizando el SDK 2.x.

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 quieres desplazarte para que la sección esté en la parte superior, haz lo siguiente:

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

Modifique sectionRect como desee para desplazar la sección deseada a la parte inferior o central del área visible.