我的iPhone应用程序的UI有很多静态标签,我在Interface Builder中为它们设置了可访问性提示。我想以编程方式访问这些,以便我可以提供帮助气泡 - UILabel的自定义子类识别触摸并显示值为[self accessibilityHint]的气泡。
但是,[self accessibilityHint]返回nil。如果我以编程方式设置值[self setAccessibilityHint:@“Hello”],那么我可以从我的程序中访问该值,但是NIB的初始值不可用。
如果我在启动应用程序之前打开辅助功能检查器,则可以通过accessibilityHint属性获取NIB文件中的提示。是否有某些标志确定系统是否加载这些属性;如果有,是否有某种方法可以设置它?
我的备份选项是让我的控制器保持对每个UI标签的引用,并在代码中设置accessibilityHint,但这非常丑陋和麻烦。
答案 0 :(得分:3)
嗯,如果我打开Library / Preferences / com.apple.Accessibility.plist并将ApplicationAccessibilityEnabled从false更改为true,那么它可以工作。 (该路径位于〜/ Library / Application Support / iPhone Simulator /)
我尝试在main()的开头添加它:
CFPreferencesSetAppValue(@"AccessibilityEnabled", kCFBooleanTrue, @"com.apple.Accessibility");
CFPreferencesSetAppValue(@"ApplicationAccessibilityEnabled", kCFBooleanTrue, @"com.apple.Accessibility");
CFPreferencesAppSynchronize(@"com.apple.Accessibility");
但它不起作用。 (它将文件写入Applications / {UUID} /Library/Preferences/com.apple.Accessibility.plist)
编辑:在单步执行UIKit代码后,确定是否打开辅助功能的调用是
CFPreferencesGetBooleanValue(@"ApplicationAccessibilityEnabled", @"/Users/sam/Library/Application Support/iPhone Simulator/User/Library/Preferences/com.apple.Accessibility", NULL);
请注意奇怪的应用程序密钥,我还不确定这个值来自何处(我对386程序集的了解非常薄弱!)但我可以将此密钥传递给CFPreferencesSetAppValue并且它可以工作,至少在模拟器上(我目前无法访问实际设备。)
此外,这将打开所有应用程序的应用程序可访问性(因为它将其写入全局plist)。如果应用程序启动后应将值设置回false,我可以从main()设置一个标志。
答案 1 :(得分:0)
这适用于模拟器和设备。取自http://sgleadow.github.com/blog/2011/11/16/enabling-accessibility-programatically-on-ios-devices/
#import <dlfcn.h>
NSAutoreleasePool *autoreleasePool = [[NSAutoreleasePool alloc] init];
NSString *appSupportLocation = @"/System/Library/PrivateFrameworks/AppSupport.framework/AppSupport";
NSDictionary *environment = [[NSProcessInfo processInfo] environment];
NSString *simulatorRoot = [environment objectForKey:@"IPHONE_SIMULATOR_ROOT"];
if (simulatorRoot) {
appSupportLocation = [simulatorRoot stringByAppendingString:appSupportLocation];
}
void *appSupportLibrary = dlopen([appSupportLocation fileSystemRepresentation], RTLD_LAZY);
CFStringRef (*copySharedResourcesPreferencesDomainForDomain)(CFStringRef domain) = dlsym(appSupportLibrary, "CPCopySharedResourcesPreferencesDomainForDomain");
if (copySharedResourcesPreferencesDomainForDomain) {
CFStringRef accessibilityDomain = copySharedResourcesPreferencesDomainForDomain(CFSTR("com.apple.Accessibility"));
if (accessibilityDomain) {
CFPreferencesSetValue(CFSTR("ApplicationAccessibilityEnabled"), kCFBooleanTrue, accessibilityDomain, kCFPreferencesAnyUser, kCFPreferencesAnyHost);
CFRelease(accessibilityDomain);
}
}
[autoreleasePool drain];