usar tutorial español como best app iphone objective-c delegates singleton

iphone - tutorial - siri shortcuts ios 12



¿Mano corta para[[UIApplication sharedApplication] delegate]? (5)

Como dijo Shaggy Frog , define una macro en tu archivo YourAppDelegate.h, un ejemplo como este:

#define AppDelegate (YourAppDelegate *)[[UIApplication sharedApplication] delegate]

Luego puedes obtener el delegado de la aplicación en tu código de esta manera:

[AppDelegate ......];

Almacené variables globales en mi AppDelegate y accedí a ellas por:

AppDelegate *d = [[UIApplication sharedApplication] delegate]; d.someString = ...

¿Cuál es la forma recomendada de guardar algo de escritura y, por lo tanto, no necesito AppDelegate *d = [[UIApplication sharedApplication] delegate]; ¿una y otra vez? ¡Gracias!


Como su delegado de la aplicación nunca cambia realmente, puede crear un externo que defina en el código de delegado de la aplicación, muy similar al NSApp externo para las aplicaciones de Mac OS X Cocoa.

Entonces, defina el externo en el encabezado de su AppDelegate (o algo más que incluiría en todas partes):

extern AppDelegate* appDelegate;

Luego créalo y colóquelo en su archivo de implementación:

AppDelegate* appDelegate = nil; // later -- i can''t recall the actual method name, but you get the idea - (BOOL)applicationDidFinishLaunchingWithOptions:(NSDictionary*)options { appDelegate = self; // do other stuff return YES; }

Luego otras clases pueden acceder a él:

#import "AppDelegate.h" // later - (void)doSomethingGreat { NSDictionary* mySettings = [appDelegate settings]; if( [[mySettings objectForKey:@"stupidOptionSet"] boolValue] ) { // do something stupid } }


Creo una category llamada UIApplication + delegate con algunos mensajes de conveniencia en ella. Conseguir que mi delegado específico sea uno de los mensajes de conveniencia. Entonces, por ejemplo, si mi delegado de aplicación se llamara MyAppDelegate , se vería así:

UIApplication + delegate.h

#import "MyAppDelegate.h" @interface UIApplication(delegate) + (MyAppDelegate *)thisApp; @end

y UIApplication + delegate.m

#import "UIApplication+delegate.h" @implementation UIApplication(delegate) + (MyAppDelegate *)thisApp { return (MyAppDelegate*)[[UIApplication sharedApplication] delegate]; } @end

En una clase que necesita el delegado, hago esto:

#import "UIApplication+delegate.h" ... - (void)doStuff { MyAppDelegate *app = [UIApplication thisApp]; // use "app" }


Simplemente puedes crear una macro de estilo C y colocarla en un archivo de encabezado en algún lugar.

(En cuanto a usar el delegado de tu aplicación como una variable global gigante, es otra perorata para otro día).


También creé una categoría, excepto que apliqué la mía a NSObject para que cualquier objeto en la aplicación pueda acceder fácilmente al delegado.

#import "MyAppDelegate.h" @interface NSObject(delegate) - (MyAppDelegate *) appDelegate; @end

#import "NSObject+delegate.h" @implementation UIApplication(delegate) - (MyAppDelegate *)appDelegate { return (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; } @end