2011-07-07 8 views
10

La ejecución de este:¿Por qué valueForKey: en un UITextField arroja una excepción para las propiedades de UITextInputTraits?

@try 
{ 
    NSLog(@"1. autocapitalizationType = %d", [self.textField autocapitalizationType]); 
    NSLog(@"2. autocapitalizationType = %@", [self.textField valueForKey:@"autocapitalizationType"]); 
} 
@catch (NSException *exception) 
{ 
    NSLog(@"3. %@", exception); 
} 

Muestra esto:

1. autocapitalizationType = 0 
3. [<UITextField 0x6c15df0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key autocapitalizationType. 

que estaba esperando:

1. autocapitalizationType = 0 
2. autocapitalizationType = 0 

Esta excepción sólo ocurre con las propiedades que son parte del protocolo UITextInputTraits. Regular propiedades de un UITextField tal tiene clearButtonMode se puede acceder a través de valueForKey:.

¿Por qué no puede acceder a las propiedades UITextInputTraits con la codificación de clave-valor?

+0

Probablemente debido a los detalles de implementación. Debe presentar un [informe de error] (http://bugreport.apple.com) con Apple. –

Respuesta

4

Si profundizar en el marco UIKit y abrir UITextField.h, encontrará:

@interface UITextField : UIControl <UITextInput, NSCoding> { 
    @private 

    UITextInputTraits *_traits; 
    UITextInputTraits *_nonAtomTraits; 

También encontrará que clearButtonMode se declara como un @property en el archivo de cabecera UITextField, pero que autocapitalizationType (y el resto del protocolo UITextInputTraits) no lo son.

Usted y yo no se llega a ver UITextField.m, por lo que todo lo que realmente podemos concluir es que Apple implementa el protocolo UITextInputTraits la UITextField 's de una manera que no es compatible con KVC. Presumiblemente, el código de pegamento en algún lugar convierte [myTextField autocapitalizationType] en el valor apropiado, pero cualquier magia que se produzca detrás de escena se detiene antes de valueForKey:.

2

Aquí está mi solución: anulé valueForKey: para cada clase implementando el método textInputTraits. Si la clave es UITextInputTraits clave, llame al valueForKey: en el objeto textInputTraits en lugar del objeto en sí.

Aquí están los detalles de implementación: 1, 2 y 3.

Cuestiones relacionadas