¿Cómo acceder a las variables del controlador de vista desde el delegado de la aplicación... y viceversa?

Me gustaría que el controlador de vista pueda acceder dog en el delegado de la aplicación.

Me gustaría que el delegado de la aplicación pueda acceder mouse en el controlador de vista.


#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
    int mouse;  // <----------------
}
@end

- (void)viewDidLoad
{
    [super viewDidLoad];

    mouse = 12;  // <-------------------

    NSLog(@"viewDidLoad %d", dog); // <---------------
}

#import <UIKit/UIKit.h>

@class ViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
    int dog;  // <---------------
}
@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) ViewController *viewController;

@end

- (void)applicationWillResignActive:(UIApplication *)application
{
    NSLog(@"applicationWillResignActive %d", mouse); // <--------------
}

 - (void)applicationDidBecomeActive:(UIApplication *)application
{
    dog = 77; // <---------------------

    NSLog(@"applicationDidBecomeActive");
}

preguntado el 03 de mayo de 12 a las 17:05

¿Cómo acceden dos objetos a las variables del otro? -

2 Respuestas

Parte 1: En ViewController.h:

-(int)mouse;  //add this before the @end

En ViewController.m, agregue este método:

-(int)mouse
{
    return mouse;
}

Para acceder al mouse desde AppDelegate, use self.viewController.mouse Por ejemplo;

NSLog(@"ViewController mouse: %i", self.viewController.mouse);

Parte 2:

En AppDelegate.h:

-(int)dog;  //add this before the @end

En AppDelegate.m, agregue este método:

-(int)dog
{
    return dog;
}

En ViewController.m:

#import "AppDelegate.h"

Para acceder al perro desde ViewController, use esto:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSLog(@"dog from AppDelegate: %i", [appDelegate dog]);  //etc.

contestado el 03 de mayo de 12 a las 19:05

En la parte 1: self.viewController.mouse posible enviar argumentos? - usuario285594

En el archivo de encabezado del controlador de vista, agregue el mouse como una propiedad:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
    NSInteger mouse;  // <----------------
}

@property (nonatomic, assign) NSInteger mouse;

@end

Sintetice la propiedad en la implementación de su controlador de vista justo debajo de la línea @implementation:

@synthesize mouse;

En su aplicación, delegue agregue perro como propiedad:

@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
    NSInteger dog;  // <---------------
}
@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) ViewController *viewController;

@property (nonatomic, assign) NSInteger dog;

@end

También sintetice dog en la implementación del delegado de su aplicación.

Ahora, en el delegado de su aplicación, suponiendo que tenga una referencia a su controlador de vista, puede acceder al mouse de esta manera:

viewController.mouse = 13;

Puede hacer lo mismo con la clase de delegado de su aplicación, a la que se puede acceder desde cualquier controlador de vista usando (suponiendo que el nombre de la clase de delegado de su aplicación sea AppDelegate):

((AppDelegate *)([UIApplication sharedApplication].delegate)).dog = 13;

Le recomendaría que use también NSInteger en lugar de int.

contestado el 03 de mayo de 12 a las 19:05

(viewController.mouse = 13;) necesita "self" -> (self.viewController.mouse = 13;) - jdl

Eso realmente dependería de si viewController es o no una propiedad sintetizada del delegado de la aplicación. Si fuera así, este sería el método preferido para acceder a él. - Pedro Willsey

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.