ios - library - Volver a cargar la sección de TableView sin volver a cargar la sección del encabezado-Swift
swift libraries (4)
Estoy intentando recargar la sección tableView en lugar de recargar toda la tableview porque tengo un campo de texto en la sección del encabezado y cuando llamo self.tableView.reloadData()
mi teclado se cierra.
He intentado el código a continuación, pero recibo este error. Terminating app due to uncaught exception ''NSInternalInconsistencyException'', reason: ''attempt to delete row 5 from section 2 which only contains 4 rows before the update''
Entonces, ¿dónde estaría mi problema?
let newCount = self.placeArray.count
var newIndexPaths = NSMutableArray(capacity: newCount)
for var i = 0 ; i < newCount ; i++ {
var indexPath = NSIndexPath(forRow: i, inSection: 2)
newIndexPaths.addObject(indexPath)
}
self.tableView.beginUpdates()
self.tableView.reloadRowsAtIndexPaths(newIndexPaths as [AnyObject], withRowAnimation: UITableViewRowAnimation.None)
self.tableView.endUpdates()
Podrías usar el método reloadSections
lugar.
tableView.reloadSections(NSIndexSet(index: 2), withRowAnimation: .None)
Swift 3.1 Xcode 8.3.3 Respuesta :)
El problema es que cada sección incluye encabezado, por supuesto, por lo que la sección es:
sección = encabezado + pie de página + filas
La respuesta es: recargar filas directamente por IndexPath. Ejemplo:
Digamos que tienes 1 sección en tu tabla y ''matriz'' de algo que usas como fuente de datos para la tabla:
let indexes = (0..<array.count).map { IndexPath(row: $0, section: 0) }
Ahora tenemos una matriz de índices de celda que queremos recargar, así que:
tableView.reloadRows(at: indexes, with: .fade)
No sé por qué las respuestas incorrectas consiguen tantos votos positivos.
Nota:
UITableView.reloadData()
recargará toda la tabla. Docs sobre reloaddatavuelva a cargar todos los datos que se utilizan para construir la tabla, incluidas las celdas, los encabezados y pies de página, las matrices de índices, etc. Para mayor eficiencia, la vista de tabla vuelve a mostrar solo las filas que son visibles. Ajusta las compensaciones si la tabla se encoge como resultado de la recarga. El delegado de la vista de tabla o el origen de datos llama a este método cuando desea que la vista de tabla vuelva a cargar completamente sus datos.
UITableView.reloadSections(_ sections: IndexSet, with animation: UITableViewRowAnimation)
volverá a cargar la sección específica ( incluido el encabezado de la sección y el pie de página ). Docs sobre recargasUITableView.reloadRows(at indexPaths: [IndexPath], with animation: UITableViewRowAnimation)
volverá a cargar las filas especificadas. Docs sobre reloadRows
Así que aquí reloadSections
no funcionará aquí. Si los datos y el estado de su sección de encabezado no cambian, llame a este método para que no se vea afectado.
Solución: use reloadRows
para cargar las filas de todas las secciones o de la sección específica. Nota: aquí solo puede cargar las filas visibles, otras se cargarán cuando desplace la vista. También puede consultar Obtener todas las rutas de índice en una sección para obtener más soluciones.
var indexPaths = self.tableView.indexPathsForVisibleRows
/* just roload visible rows of specified section
indexPaths = indexPaths.filter({ (indexPath) -> Bool in
return indexPath.section == SECTION_INDEX_NEED_TO_RELOAD
})
*/
self.tableView.reloadRows(at: indexPaths!, with: .none)
Swift 3.0.1:
let sectionIndex = IndexSet(integer: 0)
tableView.reloadSections(sectionIndex, with: .none) // or fade, right, left, top, bottom, none, middle, automatic