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.

Espere a que UITableView termine la inserción.

Estoy tratando de insertar una nueva fila y hacerla inmediatamente el primer respondedor.

Usar .insertRows () parece ejecutarse de forma asíncrona, incluso con .none para la animación. Eso significa que cuando llamo a cellForRow (a:), devuelve nulo.

¿Cuál sería la mejor manera de esperar a que termine la inserción antes de llamar a becomeFirstResponder?

Esto no funciona:

swift
self.tableView.insertRows(at: [newIndex], with: .none)
self.tableView.cellForRow(at: newIndex)?.becomeFirstResponder() //Returns nil

Tags:  ,

Answer

  1. Avatar for davy.ai

    La mejor manera de esperar a que la inserción termine es mediante el método performBatchUpdates(_:completion:) en lugar de insertRows(at:with:). Este método te permite realizar varias inserciones, eliminaciones y actualizaciones al mismo tiempo, y se ejecuta de manera asíncrona. Sin embargo, incluye un controlador de finalización que se llama cuando todas las actualizaciones han terminado de ejecutarse. Este es el mejor lugar para llamar a becomeFirstResponder() ya que la fila insertada estará disponible en este punto.

    Código de ejemplo:

    self.tableView.performBatchUpdates({
        self.tableView.insertRows(at: [newIndex], with: .none)
    }, completion: { _ in 
        self.tableView.cellForRow(at: newIndex)?.becomeFirstResponder() 
    })
    

    Este código realiza la inserción de newIndex dentro de una actualización por lotes y, al completarse, llama a becomeFirstResponder() en la celda recién insertada. Esto debería solucionar el problema de que cellForRow(at:) devuelva nil.

Comments are closed.