2008-10-01 12 views
31

En una aplicación en la que estoy trabajando, tengo un estilo sencillo 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.¿Cómo desplazo una UITableView a una sección que no contiene filas?

La aplicación de calendario de Apple es capaz de 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 Today botón 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 una UITableCell vacía en que tiene 0 píxeles de alto y desplazarse a ese. 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.

actualización

Puesto que no parece haber ninguna solución a esto, me he presentado un informe de error con manzana. Si esto le afecta también, presentar un duplicado de rdar:. // problema/6263339 (Open Radar link) si quieres esto para conseguir que esto esté arreglado más rápido

Actualización # 2

tengo una solución decente a este tema , echar un vistazo a mi respuesta a continuación.

Respuesta

113

ACTUALIZACIÓN: Parece que este error está solucionado en iOS 3.0. Usted puede utilizar 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 todavía mantiene un proyecto utilizando el SDK 2.x.


Encontrado una solución decente:

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

El código anterior se desplazará el tableview por lo que la sección deseada es visible, pero no necesariamente en la parte superior o inferior de la zona visible. Si desea desplazarse por lo que la sección es en la parte superior hacer esto:

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

Modificar sectionRect como se desee para desplazarse a la sección deseada de la parte inferior o media del área visible.

+0

[tableView scrollToRowAtIndexPath: [NSIndexPath indexPathForRow: 0 insection: sección] atScrollPosition: UITableViewScrollPositionTop animado: YES]; es mas facil – Ajumal

+0

@Aju Su método no puede desplazarse al encabezado de sección –

-1

creo una fila en blanco es probablemente la única manera de ir allí. ¿es posible rediseñar la interfaz de usuario de tal manera que la fila "vacío" puede mostrar algo útil?

Yo digo "pruébalo" y ve cómo es la actuación. advertencias sobre el uso de subvistas transparentes en sus elementos de la lista, y no encontré que importara tanto en mi aplicación.

4

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

Para mí, que realmente se necesita para hacer una nueva sección de desplazamiento a la mitad cuando se añade, por lo que ahora el uso de 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 - que está basado en el código de Mike Akers como usted puede ver, pero hace el cálculo para desplazarse hacia el centro en lugar de hacia arriba. Gracias Mike, eres una estrella.

0

Un enfoque Swift a la misma:

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) 
} 
Cuestiones relacionadas