2010-01-26 22 views
5

我有興趣以編程方式捕獲應用程序中的UI更改,並認爲UIAccessibility協議可能有所幫助。我發現如何發佈UIAccessibilityLayoutChangedNotificationUIAccessibilityScreenChangedNotification,但我不知道如何註冊才能收到這些通知。如何在iPhone App中接收UIAccessibilityNotifications

我使用NSNotificationCenter試過,但name PARAM期望一個string,而上述兩個通知是類型UIAccesibilityNotifications其爲int的。

任何想法如何註冊這些通知?

謝謝!

回答

5

這是一個很好的問題!不幸的是,您不能在不影響正常行爲的情況下收到這些「通知」 (即「不,你不能」)


如果你拆開UIKit中,你會發現UIAccessibilityPostNotification實現這樣的:

static void (*__UIAccessibilityBroadcastCallback)(UIAccessibilityNotifications notification, id argument); 
void UIAccessibilityPostNotification(UIAccessibilityNotifications notification, id argument) { 
    __UIAccessibilityBroadcastCallback (notification, argument); 
} 

這意味着這些無障礙「通知」還沒有任何正常通知。相反,它們只是內部回調函數的參數。回調函數的實現方式取決於您使用的可訪問性包。

您可以使用無證 API _UIAccessibilitySetBroadcastCallback換成你自己的回調函數:

void _UIAccessibilitySetBroadcastCallback(void (*replacement)(UIAccessibilityNotifications notification, id argument)) { 
    __UIAccessibilityBroadcastCallback = replacement; 
} 

但是,沒有一個相應的「獲取」功能(即使不是私人),所以一旦你設置它,原來的聽衆不能再被通知。

+0

感謝您的詳細解釋。只是幾個後續問題: - 是UIAccessibilitySetBroadcastCallback UIAccessibilityPostNotification的實例方法?如果是這樣,這是否意味着您只能覆蓋自定義通知的回調,而不是可能在UIWebView或其他此類視圖中實現的通知。 - 我有點不清楚如何修改私人框架。我只想將此方法簽名添加到UIKit中的UIAccessibility.h中,但我無法修改此文件。有沒有更簡單的方法來訪問這種方法? – MobileDev852 2010-01-26 21:37:06

+0

@ Mobile:(1)'_UIAccessibilitySetBroadcastCallback'是一個C函數。 (2)是的,你只能覆蓋。並被覆蓋。但是無法通過可訪問性包實現回調。 'UIWebView'只發布通知。 (3)你可以把函數原型放在任何地方。 (4)我不建議你把這個弄糟,越獄或者不越獄。 – kennytm 2010-01-27 05:36:37