2011-10-07 10 views
13

Estoy tratando de acceder al value() de un UIAStaticText (un UILabel en el código objetivo C) objeto de JavaScript. Puedo establecer el valor muy bien usando setValue() y puedo confirmar que el simulador actualiza el texto, pero cuando intento obtener el valor solo obtengo null.¿No se puede obtener el valor de UIAStaticText?

es decir

text.setValue("new text"); 

actualiza la etiqueta para "nuevo texto" en el simulador.

text.value() 

sigue devolviendo null después de que me he fijado el valor.

¿Qué estoy haciendo mal aquí?

+0

Gracias, estaba a punto de empezar a golpearse la cabeza contra la computadora portátil –

Respuesta

15

se parece a la raíz del problema está en accessibilityValue propiedad de UILabel regresar accessibilityLabel, no el texto UILabel como debería. Para resolver este problema, anulo la propiedad accessibilityValue en mi categoría personalizada UILabel.

@interface UILabel (MyAccessibility) 
@property(nonatomic, copy) NSString *accessibilityValue; 
@end 


@implementation UILabel (MyAccessibility) 

@dynamic accessibilityValue; 

-(NSString *)accessibilityValue { 
    // Here we force UIKit to return Label value, not the accessibility label 
    return self.text; 
} 

@end 

Además de este truco de menor importancia, siempre trato a preferir Identificador de la accesibilidad sobre la accesibilidad de etiquetas para preparar mis Elementos de UI para las pruebas automatizadas. Consulte la sección "Etiquetas de accesibilidad y atributos del identificador" en Instruments New Features User Guide.

+1

Impresionante. En caso de que alguien más se pregunte qué estaba pensando, resulta que no es necesario importar el encabezado de la categoría en ningún lado; solo compílalo en tu aplicación y funciona. –

12

Después de muchos horas de buscar y probar cosas que he encontrado esto en O'Reilly Answers confirmando que hay un error en el que no se puede obtener un valor para una etiqueta de texto estático mediante UIAutomation marco de Apple. Aquí está la cita:

La cadena de texto de una UILabel aparece como el nombre del campo StaticText, no su valor, que es siempre nulo. Si configura la etiqueta de Accesibilidad, se convierte en la propiedad del nombre y ya no hay forma de descubrir el texto actual en un UILabel. Tengo un informe de error abierto con Apple sobre esto.

+0

Gracias, por lo que es que me puse la etiqueta de accesibilidad que Borks esto por mí? Estaba pensando en informar esto como un error, pero algunas complicaciones con el inicio de sesión en el portal para desarrolladores de Apple me hicieron olvidarlo. – MdaG

+1

Creo que los scripts de automatización para verificar los valores de UILabel son básicamente inútiles en este momento. Usé el trabajo ofrecido en la pieza de O'Reilly: convertí mis UILabels a UITextFields no editables. La compensación es que pierdes el formato fácil para cosas como sombras paralelas, pero de lo contrario funcionaba como un amuleto. –

+0

Deberías preferir la respuesta de Viktor, que es más clara. No debe modificar su aplicación para que sea compatible con sus pruebas. –

1

En realidad, no es necesario crear la categoría especificada por Viktor Krykun. Ajuste de la accessibilityIdentifier es suficiente - docs de Apple dicen (iOS 6.1.3):

Accesibilidad etiquetas y atributos Identificador

El atributo identificador permite el uso de nombres más descriptivos para elementos. Es opcional, pero se debe establecer para el script para realizar cualquiera de estas dos operaciones:

  • Acceso a una vista de contenedor por su nombre al mismo tiempo ser capaz de acceder a sus niños.
  • Accediendo a una vista de UILabel por nombre para obtener su texto (a través de su atributo de valor).

También puede ser necesario establecer explícitamente

uilabel.accessibilityLabel = NSLocalizedString(@"Element description", @"Localized accessibility label for VoiceOver"); 
uilabel.accessibilityValue = uilabel.text; 

En mi propio código que tengo un caso en el que sólo funciona, y otra en la que tengo que establecer explícitamente los valores. Mi mejor conjetura en la diferencia es que tal vez es porque ingresé y luego eliminé la etiqueta de accesibilidad en el Interface Builder en un caso: puede terminar siendo una diferencia entre nil y cadena vacía o algo así. El código de Apple es claramente bastante frágil aquí (SDK 6.1.3, prueba en el simulador iOS 5.0).

1

En respuesta a ChrisH (ya que no veo cómo responderle): Puede aplicar el mismo truco a UITableViewCell que a UILabel y luego para el texto de una etiqueta dentro de una celda comunicarse con la celda para el valor() en lugar del texto estático en él. Aunque realmente se siente como acumular más hacks encima de los hacks. Pero no veo otra forma.

Editar: Se agregó la implementación completa que incluye la solución existente para completar.

@interface UILabel (MyAccessibility) 
@property(nonatomic, copy) NSString *accessibilityValue; 
@end 


@implementation UILabel (MyAccessibility) 

@dynamic accessibilityValue; 

-(NSString *)accessibilityValue { 
    // Here we force UIKit to return Label value, not the accessibility label 
    return self.text; 
} 

@end 


@interface UITableViewCell (AccessibilityFix) 
@property(nonatomic, copy) NSString *accessibilityValue; 
@end 


@implementation UITableViewCell (AccessibilityFix) 

@dynamic accessibilityValue; 

-(NSString *)accessibilityValue { 
    // Here we force UIKit to return Label value, not the accessibility label 
    return self.textLabel.text; 
} 

@end 
Cuestiones relacionadas