Не можете получить значение UIAStaticText?
Я пытаюсь получить доступ к value()
объекта JavaScript UIAStaticText
(a UILabel
в объектном C-коде). Я могу установить значение просто отлично, используя setValue()
, и я могу подтвердить, что симулятор обновляет текст, но когда я пытаюсь получить значение, я получаю только null
.
то есть.
text.setValue("new text");
обновляет метку до "нового текста" в симуляторе.
text.value()
по-прежнему возвращает null
после того, как я установил значение.
Что я здесь делаю неправильно?
Ответы
Ответ 1
Похоже, что корень проблемы находится в accessibilityValue
свойстве UILabel
, возвращающем accessibilityLabel
, а не в тексте UILabel
. Чтобы решить эту проблему, я переопределяю свойство accessibilityValue
в моей пользовательской категории 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
Помимо этого незначительного трюка, я всегда стараюсь предпочесть доступность Идентификатор над доступностью Ярлык для подготовки элементов пользовательского интерфейса для автоматического тестирования. Ознакомьтесь с разделом "Атрибуты специальных возможностей и идентификаторов" в "Руководство пользователя новых функций" .
Ответ 2
После многих часов поиска и попыток я нашел это на O'Reilly Answers, подтверждающий наличие ошибки, в которой вы не можете получить значение для статической текстовой метки с использованием структуры Apple UIAutomation. Вот цитата:
Строка текстовой метки UILabel отображается как имя поля StaticText, а не значение, которое всегда равно нулю. Если вы установите метку Accessibility, она станет свойством name, и больше нет способа обнаружить текущий текст в UILabel. У меня есть отчет об ошибке с Apple об этом.
Ответ 3
На самом деле, не нужно создавать категорию, указанную Виктором Крыкуном. Установка параметра accessibilityIdentifier достаточно - Apple docs скажет (iOS 6.1.3):
Атрибуты метки доступности и идентификатора
Атрибут идентификатора позволяет использовать более описательные имена для элементы. Он является необязательным, но он должен быть установлен для script для выполнения любая из этих двух операций:
- Доступ к представлению контейнера по имени, а также доступ к его дети.
- Доступ к представлению UILabel по имени для получения его отображения текст (через его атрибут value).
Также может потребоваться явно установить
uilabel.accessibilityLabel = NSLocalizedString(@"Element description", @"Localized accessibility label for VoiceOver");
uilabel.accessibilityValue = uilabel.text;
В моем собственном коде у меня есть один случай, когда он работает, и еще один, где я должен явно устанавливать значения. Мое лучшее предположение заключается в том, что, возможно, это потому, что я ввел, а затем удалил метку доступности в Interface Builder в одном случае - в конечном итоге может быть разница между нулевой и пустой строкой или чем-то еще. Яблочный код явно выглядит хрупким здесь (SDK 6.1.3, тестирование на симуляторе iOS 5.0).
Ответ 4
В ответ на ChrisH (так как я не вижу ответа на него): вы можете применить тот же трюк к UITableViewCell, что и для 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
@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