Tengo un UITableView que en algunos casos es legal estar vacío. Entonces, en lugar de mostrar la imagen de fondo de la aplicación, preferiría imprimir un mensaje amigable en la pantalla, como:
Esta lista ahora está vacía
¿Cuál es la forma más sencilla de hacerlo?
iphone
ios
uitableview
uiview
cateof
fuente
fuente
Respuestas:
La propiedad backgroundView de UITableView es tu amiga.
En
viewDidLoad
o en cualquier lugar quereloadData
deba determinar si su tabla está vacía o no, y actualice la propiedad backgroundView de UITableView con un UIView que contenga un UILabel o simplemente configúrelo como nulo. Eso es.Por supuesto, es posible hacer que la fuente de datos de UITableView realice una doble tarea y devuelva una celda especial "la lista está vacía", me parece un error. De repente,
numberOfRowsInSection:(NSInteger)section
tiene que calcular el número de filas de otras secciones sobre las que no se le preguntó para asegurarse de que también estén vacías. También necesita hacer una celda especial que tenga el mensaje vacío. Además, no olvide que probablemente necesite cambiar la altura de su celda para acomodar el mensaje vacío. Todo esto es factible, pero parece una curita además de la curita.fuente
backgroundView
propiedad oculta es el camino a seguir. ConDZNEmptyDataSet
, tenemos que usar suemptyDataSetSource
tableView.backgroundView!.userInteraction = true
después de la línea que configurótableView.backgroundView = constructMyViewWithButtons()
, o como lo configuró.Igual que la respuesta de Jhonston, pero la preferí como extensión:
Uso:
fuente
func numberOfSections(in tableView: UITableView) -> Int
métodoBasado en las respuestas aquí, aquí hay una clase rápida que hice que puedes usar en tu
UITableViewController
.En tu
UITableViewController
puedes llamar a esto ennumberOfSectionsInTableView(tableView: UITableView) -> Int
Con un poco de ayuda de http://www.appcoda.com/pull-to-refresh-uitableview-empty/
fuente
viewController.tableView.separatorStyle = .none
No es obligatorioRecomiendo la siguiente biblioteca: DZNEmptyDataSet
La forma más fácil de agregarlo en su proyecto es usarlo con Cocaopods de esta manera:
pod 'DZNEmptyDataSet'
En su TableViewController agregue la siguiente declaración de importación (Swift):
Luego, asegúrese de que su clase se ajuste al
DNZEmptyDataSetSource
yDZNEmptyDataSetDelegate
así:En su
viewDidLoad
agregar las siguientes líneas de código:Ahora todo lo que tiene que hacer para mostrar el estado vacío es:
Estos métodos no son obligatorios, también es posible mostrar el estado vacío sin un botón, etc.
Para Swift 4
fuente
Una forma de hacerlo sería modificar su fuente de datos para que regrese
1
cuando el número de filas sea cero y para producir una celda de propósito especial (quizás con un identificador de celda diferente) en eltableView:cellForRowAtIndexPath:
método.Esto puede ser algo complicado si tiene múltiples controladores de vista de tabla que necesita mantener, porque alguien eventualmente olvidará insertar una verificación cero. Un mejor enfoque es crear una implementación separada de una
UITableViewDataSource
implementación que siempre devuelva una sola fila con un mensaje configurable (llamémosloEmptyTableViewDataSource
). Cuando los datos administrados por su controlador de vista de tabla cambian, el código que administra el cambio verificará si los datos están vacíos. Si no está vacío, configure su controlador de vista de tabla con su fuente de datos regular; de lo contrario,EmptyTableViewDataSource
configúrelo con una instancia del que se haya configurado con el mensaje apropiado.fuente
deleteRowsAtIndexPaths:withRowAnimation:
ya que el número devueltonumberOfRowsInSection
debe coincidir con el resultado de $ numRows - $ rowsDeleted.He estado usando el mensaje titleForFooterInSection para esto. No sé si esto es subóptimo o no, pero funciona.
fuente
return tableView.numberOfRowsInSection(section) == 0 ? "This list is now empty" : nil
Entonces, para una solución más segura:
y para
UICollectionView
también:Más solución genérica:
fuente
Solo puedo recomendar arrastrar y soltar un UITextView dentro de TableView después de las celdas. Haga una conexión con el ViewController y escóndelo / muéstrelo cuando sea apropiado (por ejemplo, cada vez que se recargue la tabla).
fuente
Usar backgroundView está bien, pero no se desplaza bien como en Mail.app.
Hice algo similar a lo que hizo xtravar .
Agregué una vista fuera de la jerarquía de vistas de
tableViewController
.Luego usé el siguiente código en
tableView:numberOfRowsInSection:
:Básicamente agregué el
emptyStateView
como una subvista deltableView
objeto. Como los separadores se superpondrían a la vista, configuré su color enclearColor
. Para volver al color del separador predeterminado, solo puede configurarlonil
.fuente
tableHeaderView
y asegurarme de que cambie su tamaño para ajustarse .Usar un controlador de vista de contenedor es la forma correcta de hacerlo según Apple .
Puse todas mis vistas de estado vacías en un Storyboard separado. Cada uno bajo su propia subclase UIViewController. Agrego contenido directamente debajo de su vista raíz. Si se necesita alguna acción / botón, ahora ya tiene un controlador para manejarlo.
Entonces es solo una cuestión de instanciar el controlador de vista deseado de ese Storyboard, agregarlo como un controlador de vista secundario y agregar la vista de contenedor a la jerarquía de tableView (vista secundaria). Su vista de estado vacía también será desplazable, lo que se siente bien y le permite implementar pull para actualizar.
Lea el capítulo 'Agregar un controlador de vista infantil a su contenido' para obtener ayuda sobre cómo implementarlo.
Solo asegúrese de establecer el marco de vista secundario como
(0, 0, tableView.frame.width, tableView.frame.height)
y las cosas estarán centradas y alineadas correctamente.fuente
Primero, los problemas con otros enfoques populares.
Vista de fondo
La vista de fondo no se centra bien si fuera a utilizar el simple caso de configurarlo para que sea un UILabel.
Celdas, encabezados o pies de página para mostrar el mensaje
Esto interfiere con su código funcional e introduce casos extraños. Si desea centrar perfectamente su mensaje, eso agrega otro nivel de complejidad.
Rodando su propio controlador de vista de mesa
Pierde la funcionalidad incorporada, como refreshControl, y reinventa la rueda. Apéguese a UITableViewController para obtener los mejores resultados mantenibles.
Agregar UITableViewController como controlador de vista secundario
Tengo la sensación de que terminarás con problemas de ContentInset en iOS 7+, además, ¿por qué complicar las cosas?
Mi solución
La mejor solución que se me ocurrió (y, por supuesto, esto no es lo ideal) es hacer una vista especial que se pueda colocar encima de una vista de desplazamiento y actuar en consecuencia. Obviamente, esto se complica en iOS 7 con la locura ContentInset, pero es factible.
Cosas que debes tener en cuenta:
Una vez que haya resuelto esto una vez en una subclase de UIView, puede usarlo para todo: cargar hiladores, deshabilitar vistas, mostrar mensajes de error, etc.
fuente
addSubView
se adjunta a la vista de tabla, lo que siempre genera problemas con el diseño automático.Esta es la mejor y más simple solución.
fuente
Mostrar mensaje para lista vacía, moje su UITableView o UICollectionView .
Usos:
O:
Recuerde: no olvide eliminar la etiqueta del mensaje en caso de que los datos lleguen después de la actualización.
fuente
Seleccione su tableviewController Scene en storyboard
Arrastre y suelte la etiqueta Agregar UIView con su mensaje (por ejemplo: Sin datos)
cree una salida de UIView (digamos, por ejemplo, yournoDataView) en su TableViewController.
y en viewDidLoad
self.tableView.backgroundView = yourNoDataView
fuente
Usando Swift 4.2
fuente
Puede agregar esto a su clase Base.
Muéstrelo así en la clase sobre cómo obtener los datos de la API.
Escóndelo así.
fuente
Versión rápida pero mejor y más simple. ** 3.0
Espero que sirva su propósito ......
En su UITableViewController.
Clase auxiliar con función:
fuente
Probablemente no sea la mejor solución, pero lo hice simplemente poniendo una etiqueta en la parte inferior de mi tabla y si las filas = 0, entonces le asigno algo de texto. Bastante fácil y logra lo que intenta hacer con unas pocas líneas de código.
Tengo dos secciones en mi mesa (trabajos y escuelas)
fuente
La forma más fácil y rápida de hacer esto es arrastrar una etiqueta al panel lateral debajo de tableView. Cree una salida para la etiqueta y tableView y agregue una instrucción if para ocultar y mostrar la etiqueta y la tabla según sea necesario. Alternativamente, puede agregar tableView.tableFooterView = UIView (frame: CGRect.zero) esto a viewDidLoad () para dar a una tabla vacía la percepción de que está oculta si la vista de tabla y de fondo tienen el mismo color.
fuente
Hice algunos cambios para que no necesitemos verificar el recuento manualmente, también agregué restricciones para la etiqueta para que nada salga mal, no importa cuán grande sea el mensaje como se muestra a continuación:
Uso
fuente
O, alternativamente, puede usar una biblioteca ligera poco personalizable
SwiftEmptyState
fuente