2010-01-26 9 views
5

Sono interessato a catturare le modifiche dell'interfaccia utente nella mia applicazione a livello di codice e ho pensato che il protocollo UIAccessibility potrebbe essere d'aiuto. Ho trovato come pubblicare UIAccessibilityLayoutChangedNotification e UIAccessibilityScreenChangedNotification ma non sono sicuro di come registrarmi per ricevere queste notifiche.Come ricevere UIAccessibilityNotifications nell'app per iPhone

Ho provato con NSNotificationCenter, ma il parametro name aspetta un string, mentre i due notifiche sopra sono del tipo UIAccesibilityNotifications che è un int.

Qualche idea su come registrarsi per queste notifiche?

Grazie!

risposta

5

Questa è una bella domanda! Purtroppo non è possibile ricevere queste "notifiche" senza influenzare il normale comportamento. (Vale a dire "no, non è possibile")


Se si smonta UIKit, troverete UIAccessibilityPostNotification è implementato in questo modo:

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

Ciò significa che questi accessibilità "notifiche" non sono alcun notifiche normali. Piuttosto, sono solo parametri per una funzione di callback interna. Il modo in cui la funzione di callback è implementata dipende dal bundle di accessibilità che stai utilizzando.

È possibile sostituire la funzione di callback con il proprio utilizzando il non documentata API _UIAccessibilitySetBroadcastCallback:

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

Tuttavia, non v'è un corrispondente "ottenere" la funzione (nemmeno privato), quindi una volta impostato esso, gli ascoltatori originali non possono essere notificati di nuovo.

+0

Grazie per la spiegazione dettagliata. Solo alcune domande di follow-up: - _UIAccessibilitySetBroadcastCallback è un metodo di istanza di UIAccessibilityPostNotification? In questo caso, ciò significa che è possibile ignorare la funzione di callback solo per le proprie notifiche personalizzate, piuttosto che per le notifiche che possono essere implementate in UIWebView o in altre visualizzazioni di questo tipo. -Sono un po 'oscuro come modificare un framework privato. Volevo solo aggiungere questa firma del metodo a UIAccessibility.h in UIKit ma non posso modificare questo file. C'è un modo più semplice per accedere a questo metodo? – MobileDev852

+0

@Mobile: (1) '_UIAccessibilitySetBroadcastCallback' è una funzione C. (2) Sì, puoi solo ignorare. E sarai sopraffatto. Ma nessun callback è implementato dai bundle di accessibilità. Le notifiche di "solo UIWebView". (3) Puoi mettere il prototipo di funzione ovunque. (4) Non ti consiglio di scherzare con questo, jailbroken o no. – kennytm

Problemi correlati