2012-03-26 12 views
7

me gustaría obtener la opinión de que es el primer nivel de respuesta, actualmente tengo un UITableView que contiene UITextFields, utilizando un método:Vista de la que es la firstresponder

-(UIView*) findFirstResponder 
{ 

} 

me gustaría ser capaz de obtener la vista que es el primer Respondedor y luego hacer algo con esa vista.

¿Alguna idea?

+0

¿Cuántos campos de texto tiene en tableView? –

+0

Se crean dinámicamente, pero encontré la manera ahora – Armand

+0

Me alegra saberlo, simplemente publícalo como la respuesta. :) –

Respuesta

17

Todo lo que tenía que hacer era

@implementation UIView (FindViewThatIsFirstResponder) 
- (UIView *)findViewThatIsFirstResponder 
{ 
    if (self.isFirstResponder) {   
     return self;  
    } 

    for (UIView *subView in self.subviews) { 
     UIView *firstResponder = [subView findViewThatIsFirstResponder]; 
     if (firstResponder != nil) { 
      return firstResponder; 
     } 
    } 

    return nil; 
} 
@end 
+0

¿No necesitas el textField en sí? ¿Cuál es la relación entre la subvista y la tabla con textFields? – o15a3d4l11s2

+0

Para entrar en más detalles de por qué esto funcionará para mí: Tengo un UITextField que tiene un UIPickerView como un inputView, ahora estos son todos creados dinámicamente así que no tengo ninguna referencia a ningún campo excepto mi vista de tabla, entonces cuando Selecciono un campo de texto que muestra UIPickerView y luego selecciono un valor en el selector para establecer el texto del UITextField, luego tuve que llamar a un método de delegado para pasar el valor seleccionado al primer respondedor actual. vea esta pregunta http://stackoverflow.com/questions/9874037/uipickerview-and-uitextfield-get-value-from-uipickerview/ – Armand

+0

Buena solución;) – Emad

14

Uso uicontrol como referencia la raíz a diferentes tipos de control que puede ser el primer respondedor.

UIControl *currentControl; 

Como dice Gobot - siempre que un campo de texto se convierte primero en responder, mantener una nota de cuál se trata ...

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { 

    currentControl = textField; 

    . . . 
+1

Sheesh, todas estas otras soluciones son ridículas. Esta debería ser la respuesta más importante en todas las preguntas :) :) – taylorcressy

+0

¿Qué pasa si el primer respondedor no es un 'UITextField'? ¿Hay 'UITextView's también, y tal vez otros ...? No me malinterpreten, esta es una buena solución para la pregunta, pero estoy buscando algo un poco más universal. – devios1

+0

Puede usar una referencia a UIControl. Ver arriba – Damo

0

me gustaría compartido con ustedes mi aplicación para encontrar en primer nivel de respuesta en cualquier lugar de UIView. Espero que ayude y lo siento por mi inglés. Gracias

+ (UIView *) findFirstResponder:(UIView *) _view { 
    if ([subView isFirstResponder]) 
     return subView; 
    if ([subView isKindOfClass:[UIView class]]) { 
     UIView *v = subView; 

     if ([v.subviews count] > 0) { 
     retorno = [self findFirstResponder:v]; 
     if ([retorno isFirstResponder]) { 
      return retorno; 
     } 
     } 
    } 
} 
1

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

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

Cuestiones relacionadas