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
davy.ai
La mejor manera de esperar a que la inserción termine es mediante el método
performBatchUpdates(_:completion:)
en lugar deinsertRows(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 abecomeFirstResponder()
ya que la fila insertada estará disponible en este punto.Código de ejemplo:
Este código realiza la inserción de
newIndex
dentro de una actualización por lotes y, al completarse, llama abecomeFirstResponder()
en la celda recién insertada. Esto debería solucionar el problema de quecellForRow(at:)
devuelva nil.