代码之家  ›  专栏  ›  技术社区  ›  Sam McCall

AccessibilityLabel和AccessibilityHint属性并不总是从NIB加载

  •  6
  • Sam McCall  · 技术社区  · 15 年前

    我的iphone应用程序的ui有很多静态标签,我在interface builder中为它们设置了可访问性提示。我想以编程方式访问它们,以便提供帮助气泡-uilabel的一个自定义子类识别一个触摸并显示一个值为[self accessibilityhint]的气泡。

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

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

    我的备份选项是让我的控制器保留对每个ui标签的引用,并在代码中设置accessibilityhint,但这相当难看和麻烦。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Sam McCall    15 年前

    嗯,如果我打开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()设置标志。

        2
  •  0
  •   Heath Borders    13 年前

    这在模拟器和设备上工作。取自 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];