我正在尝试访问(目标 C 代码中的 a value()
)JavaScript 对象。我可以很好地设置该值,并且可以确认模拟器更新了文本,但是当我尝试获取该值时,我只得到.UIAStaticText
UILabel
setValue()
null
IE
text.setValue("new text");
在模拟器中将标签更新为“新文本”。
text.value()
设置值后仍然返回null
。
我在这里做错了什么?
我正在尝试访问(目标 C 代码中的 a value()
)JavaScript 对象。我可以很好地设置该值,并且可以确认模拟器更新了文本,但是当我尝试获取该值时,我只得到.UIAStaticText
UILabel
setValue()
null
IE
text.setValue("new text");
在模拟器中将标签更新为“新文本”。
text.value()
设置值后仍然返回null
。
我在这里做错了什么?
看起来问题的根源在于返回的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
除了这个小技巧,我总是尝试更喜欢可访问性标识符而不是可访问性标签来准备我的 UI 元素以进行自动化测试。查看Instruments New Features User Guide的“Accessibility Label and Identifier Attributes”部分。
经过数小时的搜索和尝试后,我在O'Reilly Answers上发现了这一点,确认存在一个错误,您无法使用 Apple 的 UIAutomation 框架获取静态文本标签的值。这是报价:
UILabel 的文本标签字符串显示为 StaticText 字段的名称,而不是它的值,它始终为 nil。如果您设置了 Accessibility 标签,它将成为 name 属性,并且不再有任何方法可以发现 UILabel 中的当前文本。我向 Apple 提交了一份关于此问题的错误报告。
实际上,没有必要创建 Viktor Krykun 指定的类别。设置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 模拟器上测试)。
作为对 ChrisH 的回复(因为我不知道如何回复他):您可以对 UITableViewCell 应用与 UILabel 相同的技巧,然后对于单元格内的标签文本与 value() 而不是静态的单元格进行通信里面的文字。虽然真的感觉就像在黑客之上堆积更多黑客。但我没有看到任何其他方式。
编辑:为了完整起见,添加了完整的实现,包括现有的解决方案。
@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