2011-10-07 7 views
13

Próbuję uzyskać dostęp do obiektu value() obiektu obiektu JavaScript z kodem obiektu UIAStaticText (a). Mogę ustawić wartość dobrze przy użyciu setValue() i mogę potwierdzić, że symulator aktualizuje tekst, ale kiedy próbuję uzyskać wartość, dostaję tylko null.Nie można uzyskać wartości UIASTATICTEXT?

tj

text.setValue("new text"); 

aktualizuje etykietę "Nowy tekst" w symulatorze.

text.value() 

nadal zwraca null po ustawieniu wartości.

Co ja tu robię źle?

+0

Dziękuję, miałem zacząć walić głową w laptopie –

Odpowiedz

15

Wygląda na to, że głównym problemem jest w accessibilityValue własnością UILabel powrocie accessibilityLabel, nie tekst UILabel jak powinno. Aby rozwiązać ten problem, zastępuję właściwość accessibilityValue w mojej niestandardowej kategorii 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 

Oprócz tej drobnej sztuczki, zawsze staram się preferować dostęp do identyfikatora przez etykietę dostępności, aby przygotować elementy interfejsu do automatycznego testowania. Sprawdź sekcję "Etykieta dostępności i atrybuty identyfikatora" w sekcji Instruments New Features User Guide.

+1

Awesome. Jeśli ktoś się zastanawia, o co się zastanawiam, okazuje się, że nie ma potrzeby importowania nagłówka kategorii w dowolnym miejscu; po prostu skompiluj go w swojej aplikacji i działa. –

12

Po wiele godzin poszukiwania i próbuje rzeczy znalazłem to na O'Reilly Answers potwierdzający jest błąd, gdzie nie można uzyskać wartość statycznego etykiety tekstowej przy użyciu UIAutomation ramy Apple. Oto cytat:

Ciąg tekstowy etykiety UILabel pojawia się jako nazwa pola StaticText, a nie jego wartość, która jest zawsze zerowa. Jeśli ustawisz etykietę Accessibility, stanie się ona właściwością name i nie będzie już sposobu na odkrycie bieżącego tekstu w UILabel. Mam raport o błędzie otwarty z Apple na ten temat.

+0

Dzięki, więc to, że mogę ustawić etykietę dostępności że borks to dla mnie? Myślałem o zgłoszeniu tego jako błędu, ale pewne komplikacje związane z zalogowaniem się do portalu deweloperów Jabłek spowodowały, że o tym zapomniałem. – MdaG

+1

Myślę, że skrypty automatyzacji do sprawdzania wartości UILabel są obecnie w zasadzie bezużyteczne. Wykorzystałem pracę oferowaną w utworze O'Reilly - przekonwertowałem moje UILabele na nieedytowalne UITextFields. Kompromitacja polega na tym, że tracisz łatwe formatowanie rzeczy takich jak cienie, ale poza tym działa jak urok. –

+0

Powinieneś preferować odpowiedź Wiktora, która jest czystsza. Nie należy modyfikować aplikacji, aby była kompatybilna z Twoimi testami. –

1

Właściwie nie jest konieczne tworzenie kategorii określonych przez Viktora Krykuna. Ustawianie accessibilityIdentifier wystarczy - docs Apple powiedzieć (iOS 6.1.3):

Dostępność Label i Identifier

Atrybut Identyfikator pozwala używać nazw opisowych dla elementów. To nie jest obowiązkowe, ale musi być ustawiony na skrypt do wykonywania jednej z tych dwóch operacji:

  • Dostęp widok pojemnika według nazwy, a jednocześnie jest w stanie uzyskać dostęp do jego dzieci.
  • Uzyskiwanie dostępu do widoku UILabel według nazwy w celu uzyskania wyświetlanego tekstu: (poprzez jego atrybut wartości).

Może być również konieczne jawnie ustawić

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

W moim kodu mam jeden przypadek, w którym to po prostu działa i inny gdzie mam jawnie ustawić wartości. Domyślam się, że różnica jest taka, że ​​może dlatego, że wprowadziłem, a następnie usunąłem etykietę dostępności w Konstruktorze interfejsów w jednym przypadku - może to oznaczać różnicę między pustym łańcuchem lub nicością. Kod Apple'a jest tutaj dość kruchy (SDK 6.1.3, testowanie na symulatorze iOS 5.0).

1

W odpowiedzi na Chrisa (ponieważ nie widzę odpowiedzi na niego): Możesz zastosować tę samą sztuczkę do UITableViewCell co do UILabel, a następnie, aby tekst etykiety wewnątrz komórki komunikował się z komórką dla wartości() zamiast statycznego tekstu w nim. Chociaż naprawdę wydaje się, że układa więcej hacków na hackach. Ale nie widzę żadnej innej drogi.

Edytuj: Dodano pełną implementację włącznie z istniejącym rozwiązaniem dla zapewnienia kompletności.

@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