无法始终从NIB加载accessibilityLabel和accessibilityHint属性

时间:2009-09-07 08:23:24

标签: iphone accessibility

我的iPhone应用程序的UI有很多静态标签,我在Interface Builder中为它们设置了可访问性提示。我想以编程方式访问这些,以便我可以提供帮助气泡 - UILabel的自定义子类识别触摸并显示值为[self accessibilityHint]的气泡。

但是,[self accessibilityHint]返回nil。如果我以编程方式设置值[self setAccessibilityHint:@“Hello”],那么我可以从我的程序中访问该值,但是NIB的初始值不可用。

如果我在启动应用程序之前打开辅助功能检查器,则可以通过accessibilityHint属性获取NIB文件中的提示。是否有某些标志确定系统是否加载这些属性;如果有,是否有某种方法可以设置它?

我的备份选项是让我的控制器保持对每个UI标签的引用,并在代码中设置accessibilityHint,但这非常丑陋和麻烦。

2 个答案:

答案 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];