2010-07-28 10 views
5

Estoy tratando de proporcionar un método IBAction para la funcionalidad común que se requiere en varias partes de la aplicación.¿Cómo agrego UIApplicationDelegate al final de la cadena UIResponder?

es decir, inicia sesión se implementa de forma modal, y si tiene éxito resultados en una notificación que permite a todos los controladores de vista cargados para reaccionar a este evento (transición de anónimo a autenticada)

@interface MyAppDelegate : NSObject <UIApplicationDelegate> 
{ 
    ... 
} 
- (IBAction)loginTapped:(id)sender; 
@end 

I establecer la acción de ese botón al Primer Respondedor en IB, sin embargo, la cadena de respuesta no le da al MyAppDelegate la oportunidad de responder.

Mi problema es que, no quiero replicar el método en varias partes de la cadena de respuesta, me gustaría agregarlo a una clase común que ya es una subclase.

La cadena UIResponder llega al UIApplication pero parece ser el final. Mi UIApplicationDelegate no puede participar.

¡Quiero insertar o agregar el delegado de mi aplicación a la cadena de respuesta!

(o encontrar otra manera de conectar el UIButton retoque-interna a una implementación en toda la aplicación .. Quiero evitar la subclasificación de la UITabBarController o UIWindow si es posible)

Respuesta

2

Usted podría subclase UIApplication a tener -nextResponder devolver el delegado de la aplicación si es una subclase UIResponder. Luego deberá modificar su llamada al UIApplicationMain para usar su subclase personalizada.

No lo he intentado yo mismo, pero no puedo pensar en ningún problema inmediato que esto pueda causar.

+1

me gustaría evitar la subclasificación de nada si es posible. Los documentos de Apple le guiarán para evitar la subclase de 'UIApplication': *" rara vez hay una necesidad válida de extender esta clase; ... esté muy seguro de lo que está tratando de lograr con la subclase. "* – ohhorob

0

A partir de iOS 5, AppDelegate es automáticamente el último enlace en la cadena de respuesta. Las plantillas de proyecto de Xcode crearán un AppDelegate que es una subclase de UIResponder en lugar de NSObject. Sin embargo, para evitar abarrotar la AppDelegate, anular el AppDelegate de nextResponder y descargar el trabajo en una UIResponder objeto personalizado:

- (UIResponder *)nextResponder 
{ 
    static dispatch_once_t onceToken; 
    static LastUIResponder *lastResponder = nil; 
    dispatch_once(&onceToken, ^{ 
     lastResponder = [[LastUIResponder alloc] init]; 
    }); 
    return lastResponder; 
} 
Cuestiones relacionadas