Не можете получить значение UIAStaticText? - PullRequest
13 голосов
/ 07 октября 2011

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

, т.е.

text.setValue("new text");

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

text.value()

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

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

Ответы [ 4 ]

15 голосов
/ 23 марта 2012

Похоже, что корень проблемы в 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

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

12 голосов
/ 17 октября 2011

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

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

1 голос
/ 31 октября 2013

В ответ на 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
1 голос
/ 23 июля 2013

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...