2011-10-07 11 views
13

Sto tentando di accedere allo value() di un oggetto JavaScript UIAStaticText (a UILabel nell'obiettivo C). Posso impostare il valore semplicemente usando setValue() e posso confermare che il simulatore aggiorna il testo, ma quando cerco di ottenere il valore ottengo solo null.Impossibile ottenere il valore di UIAStaticText?

cioè

text.setValue("new text"); 

aggiorna l'etichetta di "nuovo testo" nel simulatore.

text.value() 

restituisce comunque null dopo ho impostato il valore.

Cosa sto facendo di sbagliato qui?

+0

Grazie, stavo per iniziare a sbattere la testa contro il computer portatile –

risposta

15

Sembra che la radice del problema è in accessibilityValue proprietà di UILabel ritorno accessibilityLabel, non il testo UILabel come dovrebbe. Per risolvere questo problema, sostituisco la proprietà accessibilityValue nella mia categoria personalizzata 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 

Oltre a questo piccolo trucco, cerco sempre di preferire l'accessibilità Identifier sopra l'accessibilità Label per preparare i miei elementi dell'interfaccia utente per il test automatizzato. Consulta la sezione "Attributi di etichetta e identificatore di accessibilità" di Instruments New Features User Guide.

+1

Fantastico. Nel caso in cui qualcun altro si stia chiedendo cosa mi stavo chiedendo, risulta che non è necessario importare l'intestazione della categoria da nessuna parte; basta compilarlo nella tua app e funziona. –

12

Dopo molte ore di ricerca e provare cose che ho trovato questo su O'Reilly Answers conferma c'è un bug in cui non è possibile ottenere un valore per un'etichetta di testo statico utilizzando framework UIAutomation di Apple. Ecco la citazione:

La stringa di etichetta di testo di una UILabel si presenta come nome del campo di testo statico, non come valore, che è sempre nullo. Se imposti l'etichetta Accessibilità, diventa la proprietà name e non c'è più modo di scoprire il testo corrente in una UILabel. Ho un bug report aperto con Apple su questo.

+0

Grazie, quindi è che ho impostato l'etichetta di accessibilità che Borks questo per me? Stavo pensando di segnalarlo come un bug, ma alcune complicazioni con l'accesso al portale degli sviluppatori di Apples mi hanno fatto dimenticare. – MdaG

+1

Penso che gli script di automazione per controllare i valori di UILabel siano praticamente inutili al momento. Ho usato il lavoro offerto nel pezzo di O'Reilly: ho convertito i miei UILabels in UITextField non modificabili. Il compromesso è che si perde la facile formattazione per cose come le ombre esterne, ma per il resto ha funzionato come un incantesimo. –

+0

Dovresti preferire la risposta di Viktor che è più pulita. Non devi modificare la tua app per essere compatibile con i tuoi test. –

1

In realtà, non è necessario creare la categoria specificata da Viktor Krykun. Impostazione del accessibilityIdentifier è sufficiente - documenti di Apple dicono (iOS 6.1.3):

Accessibilità Etichetta e Identifier Attributi

L'attributo identificativo consente di utilizzare nomi più descrittivi per elementi. E 'facoltativo, ma deve essere impostato per lo script per eseguire una di queste due operazioni:

  • Accesso a una vista del contenitore in base al nome pur essendo in grado di accedere ai suoi figli.
  • Accesso a una vista UILabel per nome per ottenere il testo visualizzato (tramite l'attributo value).

Potrebbe anche essere necessario impostare in modo esplicito

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

Nel mio codice che ho un caso in cui funziona da solo, e un altro in cui devo impostare in modo esplicito i valori. La mia ipotesi migliore è che forse è perché ho inserito e poi eliminato l'etichetta di accessibilità in Interface Builder in un caso: potrebbe esserci una differenza tra nil e stringa vuota o qualcosa del genere. Il codice Apple è chiaramente fragile qui (SDK 6.1.3, test sul simulatore iOS 5.0).

1

In risposta a ChrisH (visto che non vedo come rispondergli): è possibile applicare lo stesso trucco a UITableViewCell come a UILabel e quindi per il testo di un'etichetta all'interno di una cella comunicare con la cella per il valore() invece del testo statico in esso. Anche se sembra davvero di accumulare più hack in cima agli hack. Ma non vedo nessun altro modo.

Modifica: aggiunta implementazione completa inclusa la soluzione esistente per completezza.

@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 
Problemi correlati