13

我正在尝试访问(目标 C 代码中的 a value())JavaScript 对象。我可以很好地设置该值,并且可以确认模拟器更新了文本,但是当我尝试获取该值时,我只得到.UIAStaticTextUILabelsetValue()null

IE

text.setValue("new text");

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

text.value()

设置值后仍然返回null

我在这里做错了什么?

4

4 回答 4

15

看起来问题的根源在于返回的accessibilityValue属性,而不是应该的文本。为了解决这个问题,我覆盖了我的自定义类别中的属性。UILabelaccessibilityLabelUILabelaccessibilityValueUILabel

@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”部分。

于 2012-03-22T20:48:08.517 回答
12

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

UILabel 的文本标签字符串显示为 StaticText 字段的名称,而不是它的值,它始终为 nil。如果您设置了 Accessibility 标签,它将成为 name 属性,并且不再有任何方法可以发现 UILabel 中的当前文本。我向 Apple 提交了一份关于此问题的错误报告。

于 2011-10-16T20:10:25.633 回答
1

实际上,没有必要创建 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 模拟器上测试)。

于 2013-07-23T19:04:32.480 回答
1

作为对 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
于 2013-10-31T19:01:51.627 回答