No hay una manera simple de encontrar firstResponder
en iOS. Las respuestas anteriores solo están rastreando UIView
s pero todas las subclases de UIResponder
como UIViewController
pueden ser las primeras en responder.
Según la Quick Help
de UIResponder
:
Muchos objetos clave también son respondedores, incluyendo el objeto UIApplication , objetos UIViewController, y todos los objetos UIView (que incluye UIWindow). A medida que ocurren los eventos, UIKit los distribuye a los objetos de respuesta de su aplicación para su manejo.
Y la única manera de seguir UIResponder
cadena va a utilizar UIResponder
's next: UIResponder
propiedad.
Devuelve el siguiente respondedor en la cadena de respuesta, o nulo si hay sin respuesta inmediata. La clase UIResponder no almacena ni configura automáticamente el siguiente respondedor , por lo que este método devuelve nil por defecto. Las subclases deben anular este método y devolver el siguiente respondedor apropiado. Por ejemplo, UIView implementa este método y devuelve el objeto UIViewController que lo administra (si tiene uno) o su supervista (si no lo tiene). UIViewController implementa de forma similar el método y devuelve la vista general de su vista. UIWindow devuelve el objeto de aplicación . UIApplication devuelve nil.
En el UIKit
objeto más superview
, UIViewController
, UIWindow
, UIApplication
o Appdelegate
será el next
UIResponder
.
extension UIResponder {
func findFirstResponder() -> UIResponder? {
var responder: UIResponder? = self
while responder != nil {
guard let r = responder, r.isFirstResponder() else {
responder = responder?.next
continue
}
return r
}
return nil
}
}
No obstante lo anterior no rastrear responder
's hermanos. Supongo que si realmente quieres rastrearlos a todos, debes verificar el tipo de respondedor y seguir su hijo (subvista, controlador de vista infantil).
¿Cuántos campos de texto tiene en tableView? –
Se crean dinámicamente, pero encontré la manera ahora – Armand
Me alegra saberlo, simplemente publícalo como la respuesta. :) –