无法获得UIAStaticText的价值?

时间:2011-10-07 13:59:18

标签: javascript ios xcode4 ios-ui-automation

我正在尝试访问value() {目标C代码中的UIAStaticText)JavaScript对象的UILabel。我可以使用setValue()设置该值,我可以确认模拟器更新了文本,但是当我尝试获取值时,我只得到null

text.setValue("new text");

在模拟器中将标签更新为“新文本”。

text.value()
在设置值后,

仍会返回null

我在这里做错了什么?

4 个答案:

答案 0 :(得分:15)

问题的根源似乎在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}}

除了这个小技巧之外,我总是尝试使用辅助功能标识符而不是辅助功能标签来准备我的UI元素以进行自动化测试。查看Instruments New Features User Guide的“辅助功能标签和标识符属性”部分。

答案 1 :(得分:12)

许多小时的搜索和尝试之后,我在O'Reilly Answers上发现了这一点,确认存在一个错误,即使用Apple的UIAutomation框架无法获取静态文本标签的值。这是引用:

  

UILabel的文本标签字符串显示为StaticText字段的名称,而不是它的值,它始终为nil。如果设置“辅助功能”标签,它将成为name属性,并且无法再以任何方式发现UILabel中的当前文本。我有一个与Apple公开的错误报告。

答案 2 :(得分:1)

实际上,没有必要创建Viktor Krykun指定的类别。设置accessibilityIdentifier就足够了 - Apple的文档说(iOS 6.1.3):

  

辅助功能标签和标识符属性

     

标识符属性允许您使用更具描述性的名称   元素。它是可选的,但必须设置脚本才能执行   这两个操作中的任何一个:

     
      
  • 按名称访问容器视图,同时也可以访问容器视图   儿童。
  •   
  • 按名称访问UILabel视图以获取其显示的内容   text(通过其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模拟器上测试)。

答案 3 :(得分:1)

回复ChrisH(因为我没有看到如何回复他):您可以将相同的技巧应用于UITabel的UITableViewCell,然后将单元格内的标签文本与值()的单元格进行通信其中的静态文本。虽然真的感觉就像在黑客上堆积更多的黑客。但我没有看到任何其他方式。

编辑:为了完整性,添加了完整的实施,包括现有的解决方案。

@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