2009-09-07 29 views
6

Giao diện người dùng của ứng dụng iPhone của tôi có nhiều nhãn tĩnh và tôi đã đặt gợi ý trợ năng cho chúng trong Trình tạo giao diện. Tôi muốn truy cập các chương trình này để tôi có thể cung cấp các bong bóng trợ giúp - một lớp con tùy chỉnh của UILabel nhận ra một liên lạc và hiển thị bong bóng có giá trị là [self accessibilityHint].AccessibilityLabel and accessibilityHint properties không phải lúc nào cũng được tải từ NIB

Tuy nhiên, [self accessibilityHint] trả về số không. Nếu tôi đặt giá trị theo lập trình [self setAccessibilityHint: @ "Hello"] thì tôi có thể truy cập giá trị đó từ chương trình của mình, nhưng giá trị ban đầu từ NIB không khả dụng.

Nếu tôi bật Trình kiểm tra khả năng truy cập trước khi khởi chạy ứng dụng của tôi, các gợi ý từ các tệp NIB có sẵn thông qua thuộc tính AccessibilityHint. Có một số cờ nào đó xác định xem hệ thống có tải các thuộc tính này hay không; và nếu có, có cách nào tôi có thể đặt nó không?

Tùy chọn dự phòng của tôi là để các trình điều khiển của tôi giữ tham chiếu đến từng nhãn giao diện người dùng và đặt mức truy cậpHint trong mã, nhưng điều đó khá xấu xí và rườm rà.

Trả lời

3

Hmm, nếu tôi mở Library/Preferences/com.apple.Accessibility.plist và thay đổi ApplicationAccessibilityEnabled từ false thành true thì nó hoạt động. (Đường dẫn Đó là trong ~ Hỗ trợ/Library/Application/iPhone Simulator /)

Tôi đã thử thêm này vào đầu của main():

CFPreferencesSetAppValue(@"AccessibilityEnabled", kCFBooleanTrue, @"com.apple.Accessibility"); 
CFPreferencesSetAppValue(@"ApplicationAccessibilityEnabled", kCFBooleanTrue, @"com.apple.Accessibility"); 
CFPreferencesAppSynchronize(@"com.apple.Accessibility"); 

nhưng nó đã không làm việc. (Nó đã viết một tệp vào Ứng dụng/{UUID} /Library/Preferences/com.apple.Accessibility.plist)

EDIT: Sau khi bước qua mã UIKit, cuộc gọi xác định xem khả năng truy cập được bật hoặc tắt là

CFPreferencesGetBooleanValue(@"ApplicationAccessibilityEnabled", @"/Users/sam/Library/Application Support/iPhone Simulator/User/Library/Preferences/com.apple.Accessibility", NULL); 

Lưu ý khóa ứng dụng kỳ lạ, tôi chưa biết giá trị này đến từ đâu (kiến thức về 386 assembly rất yếu) nhưng tôi có thể chuyển khóa này tới CFPreferencesSetAppValue và nó hoạt động, ít nhất là trên giả lập (Tôi không có quyền truy cập vào một thiết bị thực tế tại thời điểm này).

Điều này cũng sẽ bật khả năng truy cập ứng dụng cho tất cả các ứng dụng (vì nó viết nó cho toàn cầu plist). Tôi có thể đặt cờ từ main() nếu giá trị được đặt trở lại false khi ứng dụng đã khởi chạy.

+0

Tôi có thể làm cho thiết bị hoạt động bằng cách bật Trình kiểm tra khả năng truy cập. Tôi nhận ra điều này không tốt bằng một tùy chọn tự động, nhưng nó có thể dễ dàng hơn cho người mới. –

0

Tính năng này hoạt động trên trình mô phỏng và thiết bị. Lấy từ 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]; 
Các vấn đề liên quan