Не удается получить значение UIAStaticText?

#javascript #ios #xcode4 #ios-ui-automation

#javascript #iOS #xcode4 #ios-ui-автоматизация

Вопрос:

Я пытаюсь получить доступ к value() объекту JavaScript UIAStaticText (a UILabel в коде objective C). Я могу просто установить значение с помощью setValue() и я могу подтвердить, что симулятор обновляет текст, но когда я пытаюсь получить значение, я получаю только null .

т.е.

 text.setValue("new text");
  

обновляет метку на «новый текст» в симуляторе.

 text.value()
  

все еще возвращается null после того, как я установил значение.

Что я здесь делаю не так?

Комментарии:

1. Спасибо, я собирался начать биться головой о ноутбук

Ответ №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
  

Помимо этого небольшого трюка, я всегда стараюсь предпочесть идентификатор доступности метке доступности, чтобы подготовить элементы моего пользовательского интерфейса для автоматического тестирования. Ознакомьтесь с разделом «Ярлык доступности и атрибуты идентификатора» в руководстве пользователя по новым функциям инструментов.

Комментарии:

1. Потрясающе. На случай, если кому-то еще интересно, что мне было интересно, оказывается, нет необходимости импортировать заголовок категории куда-либо; просто скомпилируйте его в своем приложении, и это сработает.

Ответ №2:

После многих часов поиска и попыток я нашел это в ответах О’Рейли, подтверждающих наличие ошибки, из-за которой вы не можете получить значение для статической текстовой метки с помощью платформы UIAutomation от Apple. Вот цитата:

Строка текстовой метки UILabel отображается как имя поля StaticText, а не как его значение, которое всегда равно нулю. Если вы установите метку доступности, она становится свойством name, и больше нет никакого способа обнаружить текущий текст в UILabel. У меня есть открытый отчет об ошибке в Apple по этому поводу.

Комментарии:

1. Спасибо, значит, я установил метку доступности, которая делает это для меня? Я думал сообщить об этом как об ошибке, но некоторые сложности с входом на портал разработчиков Apple заставили меня забыть об этом.

2. Я думаю, что сценарии автоматизации для проверки значений UILabel на данный момент практически бесполезны. Я использовал обходной путь, предложенный в статье О’Рейли, — преобразовал мои UILabels в не редактируемые UITextFields. Компромисс заключается в том, что вы теряете простое форматирование для таких вещей, как отбрасываемые тени, но в остальном все работает как по маслу.

3. Вы должны предпочесть ответ Виктора, который является более чистым. Вы не должны изменять свое приложение, чтобы оно было совместимо с вашими тестами.

4. есть какие-либо обновления в вашем отчете об ошибке? Статус этого тот же?

5. Что-то новое в этом? можем ли мы уже получить значение UIStaticText с помощью UIAutomation?.

Ответ №3:

На самом деле, нет необходимости создавать категорию, указанную Виктором Крикуном. Достаточно установить accessibilityIdentifier — говорится в документах Apple (iOS 6.1.3):

Атрибуты метки доступности и идентификатора

Атрибут identifier позволяет использовать более описательные имена для элементов. Это необязательно, но оно должно быть установлено для скрипта для выполнения любой из этих двух операций:

  • Доступ к представлению контейнера по имени, а также возможность доступа к его дочерним элементам.
  • Доступ к представлению UILabel по имени для получения отображаемого текста (через его атрибут value).

Также может потребоваться явно установить

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

В моем собственном коде у меня есть один случай, когда это просто работает, и другой, когда я должен явно установить значения. Мое лучшее предположение о разнице заключается в том, что, возможно, это потому, что я ввел, а затем удалил метку доступности в Interface Builder в одном случае — в конечном итоге может возникнуть разница между nil и пустой строкой или что-то в этом роде. Код Apple здесь явно хрупкий (SDK 6.1.3, тестирование на симуляторе iOS 5.0).

Ответ №4:

В ответ на Криша (поскольку я не вижу, как ответить ему): вы могли бы применить тот же трюк к 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