es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

Tags:  , ,

Answer

  1. Avatar for 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 desde viewDidLoad, viewDidAppear y un @IBAction func didSwipeDown. Sin embargo, la tabla se actualiza al ejecutarse desde viewDidLoad y el gesto de deslizar hacia abajo, pero no desde viewDidAppear.

    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étodo self.tableView.reloadData() se llama utilizando DispatchQueue.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étodo viewDidAppear, que debería actualizar la tabla cada vez que aparece la vista, no funciona. Por lo tanto, el problema está en el método viewDidAppear.

    Solución

    La solución al problema es simple. Se debe eliminar la línea super.viewDidAppear(animated) del método viewDidAppear. La llamada super no es necesaria en este escenario porque no necesitamos llamar a la implementación de la clase principal de viewDidAppear.

    Después de eliminar la línea super.viewDidAppear(animated), el método viewDidAppear debería verse así:

    override func viewDidAppear(_ animated: Bool) {
        loadFromSQL()
    }
    

    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étodo viewDidAppear. La solución fue eliminar la línea super y actualizar las celdas con nuevos datos cada vez que se llama al método.

Comments are closed.