2009-10-22 19 views
14

Estoy tratando de usar un teclado personalizado en mi aplicación, pero estoy teniendo problemas al tratar de restringirlo a un UITextField en particular.¿Cómo saber qué UITextField causó un UIKeyboardWillShowNotification?

He basado mi código en this Xcode project (originalmente encontrado en this blog). Ese código agrega un UIButton personalizado (que representa un 'punto decimal') en la vista del teclado UIKeyboardTypeNumberPad. Lo hace suscribiéndose a UIKeyboardWillShowNotification y modificando el teclado cuando aparece.

Ese proyecto de Xcode funciona muy bien, pero cuando agrego un UITextField adicional, la clave personalizada también se coloca en el teclado para ese campo de texto, aunque he seleccionado un tipo de teclado completamente diferente para ese campo de texto.

que intentó registrar sólo para ver las notificaciones UIKeyboardWillShowNotification desde el particular UITextField, pero eso no parece funcionar:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:exampleViewController.textField]; 

También trató de inspeccionar el objeto en el interior del NSNotification pasó a keyboardWillShow, pero desafortunadamente se refiere al teclado, no al control de la IU que hizo que apareciera el teclado.

2009-10-21 19:50:22.205 Example[6302:207] NSConcreteNotification 0x321ebd0 {name = UIKeyboardWillShowNotification; userInfo = { 
UIKeyboardAnimationCurveUserInfoKey = 0; 
UIKeyboardAnimationDurationUserInfoKey = 0.300000011920929; 
UIKeyboardBoundsUserInfoKey = NSRect: {{0, 0}, {320, 216}}; 
UIKeyboardCenterBeginUserInfoKey = NSPoint: {160, 588}; 
UIKeyboardCenterEndUserInfoKey = NSPoint: {160, 372}; 

}}

¿Estoy mal entendido la interfaz addObserver? ¿Seguramente debe haber una forma de suscribirse a las notificaciones de un control de IU particular?

¿Alguien ha recibido alguna otra sugerencia sobre cómo lograr esto?

Respuesta

0

Ese proyecto funciona muy bien, pero cuando agrego un UITextField adicional, la clave personalizada se pone en el teclado para ese campo de texto también.

Puede establecer el tipo de teclado para una instancia UITextField, por ejemplo .:

[myTextField setKeyboardType:UIKeyboardTypeDefault]; 

o:

myTextField.keyboardType = UIKeyboardTypeDefault; 

Buscar la ayuda de Xcode en UITextInputTraits Protocol para una lista de UIKeyboardType constantes.

+0

puse específicamente la otra UITextField utilizar diferentes tipos de teclado. Desafortunadamente, el código del 'teclado personalizado' modifica cualquier teclado que aparezca, y no puedo encontrar la manera de distinguir qué UITextField causó que ocurriera la notificación de UIKeyboardWillShowNotification. Actualicé la publicación para aclarar un poco más. –

-2

que he logrado esto antes comparando el objeto con el objeto de interfaz de usuario que me interesa en este modo:.

if(notification.object == exampleViewController.textField) 
{ 
    ... 
} 
+7

Esto está mal. La documentación establece claramente que el objeto de notificación es nulo: "UIKeyboardWillShowNotification: publicado inmediatamente antes de la visualización del teclado. El objeto de notificación es nulo". –

21

No se pudo obtener cualquiera de los anteriores para trabajar. Tuve que hacerlo manualmente:

if ([companyName isFirstResponder]) { 
    // ............... 
} 
else if ([notes isFirstResponder]) { 
    //............. 
    } 
} 
2

Puede escribir un método de categoría UIView para encontrar el primer respondedor.

- (UIView *)firstResponder 
{ 
    if ([self isFirstResponder]) 
    { 
     return self; 
    } 

    for (UIView *view in self.subviews) 
    { 
     UIView *firstResponder= [view firstResponder]; 
     if (firstResponder) 
     { 
      return firstResponder; 
     } 
    } 

    return nil; 
} 

Luego, en el método de - (void)keyboardWillShow:(NSNotification *)notification se puede utilizar de esta manera

UITextField *textField = (UITextField *)[self firstResponder]; 
+0

Esto funcionó para mí. – Stunner

Cuestiones relacionadas