2010-01-26 19 views
5

Estoy interesado en capturar cambios de UI en mi aplicación mediante programación y pensé que el protocolo UIAccessibility podría ayudar. He encontrado cómo publicar UIAccessibilityLayoutChangedNotification y UIAccessibilityScreenChangedNotification, pero no estoy seguro de cómo registrarse para recibir estas notificaciones.Cómo recibir UIAccessibilityNotifications en la aplicación de iPhone

He intentado usar NSNotificationCenter, pero el name parámetro espera una string, mientras que las dos notificaciones anteriormente son del tipo UIAccesibilityNotifications que es un int.

¿Alguna idea de cómo registrarse para estas notificaciones?

Gracias!

Respuesta

5

¡Esa es una gran pregunta! Lamentablemente, no puede recibir estas "notificaciones" sin afectar el comportamiento normal. (Es decir, "no, no puedes")


Si desmonta UIKit, encontrará UIAccessibilityPostNotification se implementa como esto:

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

Esto significa que estas accesibilidad "notificaciones" no son ninguna notificaciones normales. Más bien, son solo parámetros para una función de devolución de llamada interna. Cómo se implementa la función de devolución de llamada depende del paquete de accesibilidad que está utilizando.

Puede reemplazar la función de devolución de llamada con su propio uso de la API no documentada _UIAccessibilitySetBroadcastCallback:

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

Sin embargo, no hay un correspondiente "obtener" la función (ni siquiera privado), por lo que una vez que establezca esto, los oyentes originales no pueden ser notificados de nuevo.

+0

Gracias por la explicación detallada. Solo unas pocas preguntas de seguimiento: - ¿Es el método _UIAccessibilitySetBroadcastCallback un método de instancia de UIAccessibilityPostNotification? Si es así, ¿significa que solo puede anular la devolución de llamada para sus propias notificaciones personalizadas, en lugar de las notificaciones que pueden implementarse en UIWebView o en alguna otra vista similar? -No tengo muy claro cómo modificar un marco privado. Solo quería agregar esta firma de método a UIAccessibility.h en UIKit pero no puedo modificar este archivo. ¿Hay alguna manera más fácil de acceder a este método? – MobileDev852

+0

@Móvil: (1) '_UIAccessibilitySetBroadcastCallback' es una función C. (2) Sí, solo puede anular. Y ser anulado. Pero no la devolución de llamada se implementa mediante los paquetes de accesibilidad. El 'UIWebView' solo publica notificaciones. (3) Puede poner el prototipo de función en cualquier lugar. (4) No te recomiendo que te metas con esto, jailbroken o no. – kennytm

Cuestiones relacionadas