2011-10-07 60 views
13

我試圖訪問UIAStaticText(客觀C代碼中的UILabel)JavaScript對象的value()。我可以使用setValue()設置該值,我可以確認模擬器更新文本,但是當我嘗試獲取值時,我只能得到null無法獲取UIAStaticText的值?

text.setValue("new text"); 

更新標籤在模擬器 「新文本」。

text.value() 

仍然返回null我設置了該值後。

我在這裏做錯了什麼?

+0

謝謝你,我正要開始敲我的頭靠在筆記本 –

回答

15

貌似問題的根源是在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的「輔助功能標籤和標識符屬性」部分。

+1

太棒了。如果有人想知道我在想什麼,事實證明沒有必要在任何地方導入類別標題;只需在你的應用中編譯它就行了。 –

12

經過多年小時搜索和嘗試新事物,我發現這對O'Reilly Answers確認存在這樣的情況你不能使用蘋果的UIAutomation框架靜態文本標籤值的錯誤。這裏是報價:

UILabel的文本標籤字符串顯示爲StaticText字段的名稱,而不是它的值,它始終爲零。如果您設置了輔助功能標籤,它將成爲名稱屬性,並且不再有任何方法可以發現UILabel中的當前文本。我有一個關於此問題的Apple報告。

+0

感謝,所以這是我設置的無障礙標籤,該標籤borks這對我來說?我正在考慮將此報告爲一個錯誤,但是由於登錄到Apples開發人員門戶而出現的一些問題使我忘記了這一點。 – MdaG

+1

我認爲自動化腳本檢查UILabel值目前基本沒有用處。我使用了O'Reilly提供的工作 - 將我的UILabels轉換爲不可編輯的UITextFields。權衡是,你失去了簡單的格式,如陰影的東西,但其他工作就像一個魅力。 –

+0

你應該更喜歡Viktor的答案更清潔。您不應該修改您的應用程序以便與您的測試兼容。 –

1

實際上,沒有必要創建Viktor Krykun指定的類別。設置accessibilityIdentifier足夠 - 蘋果的文件說(的iOS 6.1.3):

輔助標籤和標識屬性

標識符屬性允許您爲 元素使用更具描述性的名稱。它是可選的,但它必須被設置爲腳本來執行 這兩種操作:

  • 通過名字來訪問一個容器視圖,同時還能夠訪問其 孩子。
  • 按名稱訪問UILabel視圖以獲取其顯示的 文本(通過其值屬性)。

它也可能有必要明確設置

uilabel.accessibilityLabel = NSLocalizedString(@"Element description", @"Localized accessibility label for VoiceOver"); 
uilabel.accessibilityValue = uilabel.text; 

在我自己的代碼中,我有一個情況下它只是工作,而另一個在那裏我有明確設置的值。我最好的猜測是,可能是因爲我在一個案例中輸入並刪除了Interface Builder中的輔助功能標籤 - 最終可能是零字符串和空字符串之間的區別。 Apple的代碼在這裏顯然很脆弱(SDK 6.1.3,在iOS 5.0模擬器上測試)。

1

回覆ChrisH(因爲我沒有看到他是如何回覆的):您可以將相同的技巧應用於UITableViewCell和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 


@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