¿Por qué mi tabla no se actualiza desde viewDidAppear pero sí desde viewDidLoad y al hacer swipe hacia abajo en IBAction?
Tengo una aplicación de pedido de comida que tiene una pestaña “pedido” con una tabla que muestra los elementos del pedido y debajo de la tabla, etiquetas con el subtotal y total en $$. Los datos del pedido se almacenan en una base de datos SQLite.
Tengo una función llamada loadFromSQL
que lee los datos en arrays que se utilizan para rellenar las celdas de la tabla y las etiquetas de total en $$.
Llamo a loadFromSQL
desde viewDidLoad
, viewDidAppear
y una función @IBAction didSwipeDown
. La tabla se actualiza al ejecutarse desde viewDidLoad
y al hacer swipe-down, pero no desde viewDidAppear
. Sé que el SQL se está leyendo porque las etiquetas de total en $$ se actualizan incluso cuando se llaman desde viewDidAppear
.
Llamo a self.tableView.reloadData
en DispatchQueue.main.async
justo después de actualizar las etiquetas de total en $$ al final de loadFromSQL
.
Aquí hay algunos fragmentos de código:
@IBAction func didSwipeDown() {
loadFromSQL()
}
override func viewDidLoad() {
super.viewDidLoad()
loadFromSQL()
let nib = UINib(nibName: "OrderTableViewCell", bundle: nil)
tableView.register(nib, forCellReuseIdentifier: "OrderTableViewCell")
tableView.delegate = self
tableView.dataSource = self
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
loadFromSQL()
}
Esto es del final de loadFromSQL
:
sqlite3_finalize(selectStatementQuery)
// Calcular subtotal y total
dispOrderTotal = dispTotTax + dispSubTotal
let formattedTax = String(format: "$%.2f", dispTotTax)
let formattedSub = String(format: "$%.2f", dispSubTotal)
let formattedTotal = String(format: "$%.2f", dispOrderTotal)
self.orderTotalLab.text = formattedTotal
self.taxLab.text = formattedTax
self.subTotLab.text = formattedSub
DispatchQueue.main.async {
self.tableView.reloadData()
}
Cualquier idea sería muy apreciada.
davy.ai
Problema con la actualización de la tabla en la aplicación iOS de pedidos de comida
Descripción del problema
La aplicación iOS de pedidos de comida tiene una pestaña de pedidos con una tabla que muestra los elementos del pedido, y debajo de la tabla, etiquetas con el subtotal y el total en dólares. Los datos se almacenan en una base de datos SQLite, y una función llamada
loadFromSQL
lee los datos en arreglos que llenan las celdas de la tabla y las etiquetas de total. La función se llama desdeviewDidLoad
,viewDidAppear
y un@IBAction func didSwipeDown
. Sin embargo, la tabla se actualiza al ejecutarse desdeviewDidLoad
y el gesto de deslizar hacia abajo, pero no desdeviewDidAppear
.Análisis del problema
A medida que la función
loadFromSQL
actualiza las etiquetas de total, los datos de SQL se leen correctamente. Además, el métodoself.tableView.reloadData()
se llama utilizandoDispatchQueue.main.async
justo después de actualizar las etiquetas de total. Por lo tanto, es poco probable que el problema sea una condición de carrera.El método
viewDidLoad
parece funcionar correctamente, ya que actualiza la tabla. Sin embargo, el métodoviewDidAppear
, que debería actualizar la tabla cada vez que aparece la vista, no funciona. Por lo tanto, el problema está en el métodoviewDidAppear
.Solución
La solución al problema es simple. Se debe eliminar la línea
super.viewDidAppear(animated)
del métodoviewDidAppear
. La llamadasuper
no es necesaria en este escenario porque no necesitamos llamar a la implementación de la clase principal deviewDidAppear
.Después de eliminar la línea
super.viewDidAppear(animated)
, el métodoviewDidAppear
debería verse así:Esto debería solucionar el problema de actualización de la tabla. Ahora, la tabla se actualizará cada vez que aparezca la vista.
Conclusión
El problema con la actualización de la tabla en la versión iOS de la aplicación de pedidos de comida se debió a una llamada innecesaria a
super
en el métodoviewDidAppear
. La solución fue eliminar la líneasuper
y actualizar las celdas con nuevos datos cada vez que se llama al método.