Hacer que la variable esté disponible para toda la aplicación utilizando AppDelegate.

Estoy extraordinariamente confundido por el concepto de usar el delegado de la aplicación para hacer que una variable pueda configurarse y usarse en cualquier lugar de mi aplicación. Aquí está mi código:

appdelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate> { NSMutableString *globalUsername; } @property (strong, nonatomic) UIWindow *window; @property (nonatomic, retain) NSMutableString *globalUsername; 

appdelegate.m

 @synthesize globalUsername; 

y otra escena de vista (llamada "Forum.h" donde bash establecer el valor)

 AppDelegate *appDelegate = (MyAppDelegate *)[[[UIApplication shanetworkingApplication] delegate]]; [appDelegate globalUsername appendString; 

la última línea está incompleta, por supuesto, pero xcode activa automáticamente la variable globalUsername, simplemente no puedo llamar a la function "appendString" para cambiarla realmente.

Erm, si estás intentando almacenar un nombre de usuario, ¿por qué no utilizas NSUserDefaults?

 // set the username [[NSUserDefaults standardUserDefaults] setValue:@"johnsmith" forKey:@"username"]; [[NSUserDefaults standardUserDefaults] synchronize]; // retrieve the user name NSString *username = [[NSUserDefaults standardUserDefaults] valueForKey:@"username"]; 

Te falta un set de [], esos son en realidad dos enunciados en uno. primero se llama al método globalUsername en appDelegate y el resultado de eso es enviar el post appendString (que no tiene parameters)

Entonces esto debería verse así:

 [[appDelegate globalUsername] appendString:@"foobar"]; 

Pero para un juego no debes abusar del delegado de la aplicación así. Más bien, recomiendo que si quieres un lugar global para almacenar el estado del juego, deberías considerar tener un Singleton, como he descrito aquí: http://www.cocoanetics.com/2009/05/the-death-of-global-variables /

PS: probablemente no quieras trabajar con una cadena mutable allí por varios motivos. Es mejor tener la propiedad / ivar un NSString normal y luego simplemente configurarlo. No veo ninguna buena razón por la que desee agregar caracteres al nombre de un usuario. Aunque NSStrings son inmutables, simplemente puede replacelos por otros.

 [[appDelegate setGlobalUsername:@"foobar"]; 

o con el mismo efecto:

 appDelegate.globalUsername = @"foobar"; 

Si es NSMutableString, entonces tiene alloc – init en la class 'Delegate'.

Porque si se trata de un object mutable, entonces tienes que asignar & init.

Primero, en la class Delegate.m

 globalUserName = [[NSMutableString alloc] init]; 

Entonces,

En ViewController, puedes usar,

 appDelegate.globalUsername appendString ....(What you want) 

Gracias.

Creo que tienes la relación entre el delegado y sus controlleres de vista mezclados. AppDelegate se crea cuando inicia la aplicación. En lugar de crear AppDelegate en Forum.h, crea el ViewController, Forum, en AppDelegate. También el * globalUserName en las llaves es innecesario.

Entonces AppDelegate.h decía:

 @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (nonatomic, retain) NSMutableString *globalUsername; @property (nonatomic, retain) Forum *forum; 

Además, en la versión actual de Xcode y Objective-C, sintetizar también es innecesario. Se configura e inicializa automáticamente. En AppDelegate.m, puede consultar * globalUsername usando:

 self.globalUsername 

Su AppDelegate.m también debe include lo siguiente en applicationDidLaunch:

 [[self.forum alloc] init]; //Allocate and initialize the forum ViewController self.forum.delegate = self; //Set the forum ViewController's delegate variable to be the AppDelegate itself 

Pero el Forum ViewController actualmente no tiene una variable nombrada como delegada, así que tendremos que crear eso. Entonces en Forum.h deberías agregar:

 @property (nonatomic) id delegate; 

Así que ahora en Forum.m, ya que AppDelegate.m se encargó de configurar el delegado, ahora podemos consultar los datos en AppDelegate utilizando la variable de delegado de Forum.

Entonces, finalmente, para acceder a globalUsername desde Forum.m, podemos usar self.delegate.globalUsername. Entonces, para anexar a la cadena de Forum.m, podemos usar:

 [self.delegate.globalUsername appendString:myNewString]; 

Donde "myNewString" es la cadena que desea agregar a globalUsername.

Espero que esto ayude.

@interface AppDelegate : UIResponder <UIApplicationDelegate> { NSMutableString *globalUsername; }

Esto no crea una variable global. De hecho, es un miembro protegido de la class AppDelegate.

De todas las classs no puedes acceder a él. Necesita crear otra instancia más de AppDelegate y sabrá que ivar.

El término global se refiere a que tendrá el mismo valor a través de la aplicación en todas las classs. Y no necesita asignar + init cada vez.

Para Global Variable, necesita crear una variable estática. Una class compartida / class Singleton funcionará para usted.

Creo que olvidaste alloc . Simplemente alloc una vez en la application did finish launching método de application did finish launching .