ios - numero - ¿Cómo puedo agregar/eliminar celdas en una vista de tabla de forma más elegante?
comando para insertar filas en excel mac (3)
Creo que este es probablemente un problema XY, así que daré primero información básica.
Estoy construyendo una aplicación que puede mostrar una "forma". El usuario puede completar el formulario con algunas cosas y crear algunas cosas personalizadas.
Creo que lo más adecuado es usar una vista de tabla para el formulario. Y puedo mostrar todos los cuadros de texto que deben completarse, en cada una de las celdas de la tabla.
Aquí hay una captura de pantalla:
El botón "Agregar nueva entrada" insertará una nueva celda en la parte inferior cuando se toque. Y si deslizas una de las entradas hacia la izquierda, obtienes el botón "Eliminar". Puedes usar eso para borrar la entrada.
Como puede ver, esta vista de tabla necesita agregar y eliminar filas.
Originalmente, estaba usando un cocoapod llamado "TableViewModel", que hace que esto sea muy fácil. Pero luego encontré un error realmente grave en la biblioteca, así que no quiero usarlo más.
Intenté usar los métodos deleteRowsAtIndexPaths
e insertRowsAtIndexPaths
la vista de tabla. Pero si lo hago así:
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = UITableViewCell()
cell.textLabel?.text = "Hello"
return cell
}
// I use motionEnded here because I don''t want to add a button or anything just to test this
override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) {
tableView.deleteRowsAtIndexPaths([NSIndexPath(forRow: 0, inSection: 0)], withRowAnimation: .Fade)
}
Se producirá una excepción que indica que la vista de tabla no es coherente con la fuente de datos después de eliminar una fila. Esto significa que tengo que tener código para manejar esta incoherencia. Esto definitivamente hará que mi código sea más difícil de leer.
Lo mismo ocurre con el método de inserción.
Además, necesito hacer un seguimiento de cuántas filas hay en cada sección. Y mi código simplemente se vuelve realmente desordenado e inmanejable con todo eso.
También busqué otras bibliotecas, pero todas son realmente extrañas y no tan sencillas como "tableViewModel". Todos parecen requerirme que cree un modelo para la vista de tabla. No entiendo cómo hacer eso en mi caso. ¡Solo quiero mostrar un montón de campos de texto!
¿Cómo puedo insertar o eliminar filas de forma más elegante? Creo que necesito escribir una extension
de la vista de tabla o aprender a escribir un modelo para mi vista de tabla. Pero no puedo hacer ninguno de estos métodos.
Porque no tienes ninguna data source
. También vea logically
: suponga que agrega una nueva fila con insertRowsAtIndexPaths. Entonces ahora tienes 2 rows
. Sin embargo, su numberOfRowsInSection
siempre devuelve 1. por lo que se bloqueará y viceversa para su eliminación. Se supone que la vista de tabla funciona con una collection
( NSArray
, NSDictionary
, NSSet
, etc.). Para su ayuda:
Ya tienen una forma como la tuya
obj-c fácil de entender cómo funciona la vista de tabla con la fuente de datos
¡Encontré una solución!
Básicamente, conservo una matriz de celdas para que se muestre la vista de tabla:
var cells: [[UITableViewCell]] = [[], [], []] // I have 3 sections, so 3 empty arrays
Y luego agregué estos métodos de fuente de datos:
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return cells.count
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return cells[section].count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
return cells[indexPath.section][indexPath.row]
}
Ahora puedo agregar y eliminar celdas súper fácilmente:
func addCellToSection(section: Int, index: Int, cell: UITableViewCell) {
cells[section].insert(cell, atIndex: index)
tableView.insertRowsAtIndexPaths([NSIndexPath(forRow: index, inSection: section)], withRowAnimation: .Left)
}
func removeCellFromSection(section: Int, index: Int) {
cells[section].removeAtIndex(index)
tableView.deleteRowsAtIndexPaths([NSIndexPath(forRow: index, inSection: section)], withRowAnimation: .Left)
}
¡Con solo dos líneas, puedo agregar / eliminar celdas con animación!
Puede usar TableView
para crear el formulario, pero debe diseñar un dataSource apropiado para realizar un seguimiento de estos datos. Ahora el método dataSource debe ser modificado para
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return yourDataSourceForSection.count
}
Puede editar este dataSource cuando se realiza una operación de eliminación de la siguiente manera
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
//Delete the row from the data source to ensure consistency
self.array.removeAtIndex(indexPath.row)
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
}
}
Puede usar una clase modelo como dataSource
.
class NewCustomOperation: NSObject {
var name: String?
var rejectFloatingPoints: Bool?
var inputs: AvailableInputs?
var results: Results?
}
class AvailableInputs: NSObject {
var name: [String]?
var description: [String]?
}
class Results: NSObject {
var name: [String]?
var formula: [String]?
}