我正在尝试访问value()
{目标C代码中的UIAStaticText
)JavaScript对象的UILabel
。我可以使用setValue()
设置该值,我可以确认模拟器更新了文本,但是当我尝试获取值时,我只得到null
。
即
text.setValue("new text");
在模拟器中将标签更新为“新文本”。
text.value()
在设置值后,仍会返回null
。
我在这里做错了什么?
答案 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