Подтвердить что ты не робот

Не можете получить значение UIAStaticText?

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

то есть.

text.setValue("new text");

обновляет метку до "нового текста" в симуляторе.

text.value()

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

Что я здесь делаю неправильно?

4b9b3361

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