【问题标题】:Can't get value of UIAStaticText?无法获得 UIAStaticText 的值?
【发布时间】:2011-10-07 13:59:18
【问题描述】:

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

text.setValue("new text");

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

text.value()

在我设置完值后仍然返回null

我在这里做错了什么?

【问题讨论】:

  • 谢谢,我正要开始用头撞笔记本电脑

标签: javascript ios xcode4 ios-ui-automation


【解决方案1】:

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

@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 的“辅助功能标签和标识符属性”部分。

【讨论】:

  • 太棒了。如果其他人想知道我想知道什么,事实证明没有必要在任何地方导入类别标题;只需在您的应用程序中编译它即可。
【解决方案2】:

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

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

【讨论】:

  • 谢谢,是我设置了可访问性标签,这对我来说很麻烦吗?我曾考虑将此报告为一个错误,但登录 Apple 开发者门户的一些复杂问题让我忘记了它。
  • 我认为检查 UILabel 值的自动化脚本目前基本上没用。我使用了 O'Reilly 文章中提供的解决方法——将我的 UILabel 转换为不可编辑的 UITextField。权衡是你失去了像阴影这样的简单格式,但在其他方面就像一个魅力。
  • 您应该更喜欢 Viktor 的答案,它更简洁。您不应修改您的应用以兼容您的测试。
  • 您的错误报告有任何更新吗?这个状态是一样的吗?
  • 有什么新东西吗?我们可以使用 UIAutomation 获取 UIStaticText 的值吗?
【解决方案3】:

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

可访问性标签和标识符属性

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

  • 按名称访问容器视图,同时还能够访问其 孩子们。
  • 按名称访问 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 模拟器上测试)。

【讨论】:

    【解决方案4】:

    回复 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
    

    【讨论】:

      猜你喜欢
      • 2012-10-26
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多