tarda puedo imposible desactivar cuanto buscar buscando bloqueo apple actualizarse actualizar actualizacion activacion iphone ipad ios

iphone - puedo - ¿Hay alguna manera de preguntarle a iOS cuál de sus hijos tiene el estado de primera respuesta?



no puedo actualizar ios 11 (4)

Esta pregunta ya tiene una respuesta aquí:

En Mac OS X, puedes encontrar al primer respondedor así:

[[self window] firstResponder]

¿Hay alguna forma de hacerlo en iOS? ¿O necesita enumerar los controles secundarios y enviar un mensaje isFirstResponder a cada uno?


Escribí una categoría en UIResponder para encontrar el primer respondedor

@interface UIResponder (firstResponder) - (id) currentFirstResponder; @end

y

#import <objc/runtime.h> #import "UIResponder+firstResponder.h" static char const * const aKey = "first"; @implementation UIResponder (firstResponder) - (id) currentFirstResponder { [[UIApplication sharedApplication] sendAction:@selector(findFirstResponder:) to:nil from:self forEvent:nil]; id obj = objc_getAssociatedObject (self, aKey); objc_setAssociatedObject (self, aKey, nil, OBJC_ASSOCIATION_ASSIGN); return obj; } - (void) setCurrentFirstResponder:(id) aResponder { objc_setAssociatedObject (self, aKey, aResponder, OBJC_ASSOCIATION_ASSIGN); } - (void) findFirstResponder:(id) sender { [sender setCurrentFirstResponder:self]; } @end

Luego, en cualquier clase que se derive de un UIResponder , puede obtener el primer respondedor llamando

UIResponder* aFirstResponder = [self currentFirstResponder];

¡pero recuerde importar primero el archivo de interfaz de categoría UIResponder!

Esto usa API documentadas, por lo que no debería haber problemas de rechazo en la tienda de aplicaciones.


Realmente me gusta la solución de VJK , pero como MattDiPasquale sugiere, parece más compleja de lo necesario. Así que escribí esta versión más simple:

C objetivo

#import "UIResponder+FirstResponder.h" static __weak id currentFirstResponder; @implementation UIResponder (FirstResponder) +(id)currentFirstResponder { currentFirstResponder = nil; [[UIApplication sharedApplication] sendAction:@selector(findFirstResponder:) to:nil from:nil forEvent:nil]; return currentFirstResponder; } -(void)findFirstResponder:(id)sender { currentFirstResponder = self; } @end

Swift 4

import UIKit extension UIResponder { private static weak var _currentFirstResponder: UIResponder? static var currentFirstResponder: UIResponder? { _currentFirstResponder = nil UIApplication.shared.sendAction(#selector(UIResponder.findFirstResponder(_:)), to: nil, from: nil, for: nil) return _currentFirstResponder } @objc func findFirstResponder(_ sender: Any) { UIResponder._currentFirstResponder = self } }

También lo convertí en un método de clase, ya que parecía tener más sentido. Ahora puede encontrar al primer respondedor de la siguiente manera: [UIResponder currentFirstResponder]


Si necesita una primera respuesta para poder pedirle que renuncie a su estado, aquí hay un enfoque para lograr que alguno renuncie. UIView tiene un método que iterará a través de todas las subvistas de UIViews y le pedirá a cualquier persona que responda primero que renuncie.

[[self view] endEditing:YES];

Aquí hay un enlace a los documentos UIView de Apple: "Este método examina la vista actual y su jerarquía de subvista para el campo de texto que actualmente es el primer respondedor. Si encuentra uno, le pide al campo de texto que renuncie como primera respuesta. el parámetro se establece en SÍ, el campo de texto nunca se solicita, se lo fuerza a renunciar ".


isFirstResponder iterar sobre todos los controles secundarios y probar la propiedad isFirstResponder . Cuando te encuentres con TRUE , sal del ciclo.

UIView *firstResponder; for (UIView *view in self.view.subviews) //: caused error { if (view.isFirstResponder) { firstResponder = view; break; } }

MEJOR SOLUCIÓN

Ver la respuesta de Jakob .