El método de llamada de otra class no funciona correctamente

Estoy intentando cambiar el text y la position de un UILabel de otra class.

Logré llamar con éxito al método my -changeLabel, que está en mi class FirstViewController, desde la class SecondViewController. Aquí está el código que he usado en mis dos classs:

SecondViewController:

#import "FirstViewController.h" @interface SecondViewController () @property (nonatomic,strong) FirstViewController *firstViewController; @end @implementation SecondViewController @synthesize firstViewController; - (IBAction)button:(id)sender { firstViewController = [[FirstViewController alloc] init]; [firstViewController changeLabel]; } 

FirstViewController:

 - (void)changeLabel { NSLog(@"changeLabel is called!"); label.text = @"New text."; label.frame = CGRectMake(10, 100, 150, 40); NSLog(@"%@", label.text); NSLog(@"%f", label.frame.size.width); } 

Lo extraño es que el registrador se ve así después de presionar el "button" que llama al método:

 "2013-12-30 19:24:50.303 MyApp[655:70b] changeLabel is called!" "2013-12-30 19:24:50.305 MyApp[655:70b] New text." "2013-12-30 19:24:50.308 MyApp[655:70b] 0.000000" 

Parece que el text de la label cambia, pero no aparece en la pantalla. Y el ancho de la label se registra como 0.0 … a pesar de que acabo de establecerlo en 150.

¿Por qué está pasando esto? ¿No puedo cambiar las variables de marco de otra class? Hay otra manera de hacer esto?

IMPORTANTE:

Como el FirstViewController es el controller de vista principal, mientras que el SecondViewController es un menu lateral, similar a la aplicación de Facebook:

introduzca la descripción de la imagen aquí

Quiero poder presionar un "button" en el SecondViewController (menu lateral) y llamar a un método en el FirstViewController (principal) que cambia la position (marco) de un UILabel .

EDITAR:

Aquí es cómo creé la UILabel:

 label = [[UILabel alloc] init]; label.frame = CGRectMake(0, 0, 150, 40); label.text = @"Text." [self.view addSubview:label]; 

Creo que el problema es esto. Está invocando el método de la nueva instancia de FirstViewController .

Supongamos

 1. FirstViewController at stack[0]. 2. SecondViewController at stack[1]. 

Si navega o se mueve desde

FirstViewController->SecondViewController

En este caso, FirstViewController ya está en la memory con alguna dirección 0x23ffff .

Y en SecondViewController está creando de nuevo una nueva instancia de FirstViewController que apunta a otra dirección '0x234jurhu`

 - (IBAction)button:(id)sender { firstViewController = [[FirstViewController alloc] init]; [firstViewController changeLabel]; } 

No cree una nueva instancia aquí.

Puede usar el concepto delegate o NSNotification para esto.

¿Cómo se muestra FirstViewController ?

Aquí está el problema:

 firstViewController = [[FirstViewController alloc] init]; [firstViewController changeLabel]; 

Usted crea una nueva instancia de FirstViewController y actualiza el text de la label. Si usa estos VC en una stack de navigation y regresa a FirstViewController desde SecondViewController , no verá ningún cambio de label porque son instancias diferentes de la class.

Si usas FirstViewController como un childViewController de SecondViewController (con el nombre de ellos, no creo que esto sea lo que estás haciendo), entonces en el - (IBAction)button:(id)sender método de - (IBAction)button:(id)sender no necesitas instanciar una nueva instancia de FirstViewController en cada button presiona.

He descubierto una manera de hacerlo gracias a la respuesta de "@Gaurav Wadhwani" sobre esta pregunta: método de llamada de otra class (tema propio) .

FirstViewController.h este código en mi FirstViewController.h :

 + (FirstViewController *)singletonInstance; 

Y luego agregué este código en mi FirstViewController.m

 static FirstViewController *_singletonInstance = nil; +(FirstViewController*)singletonInstance { @synchronized([FirstViewController class]) { if (!_singletonInstance) _singletonInstance = [[self alloc] init]; return _singletonInstance; } return nil; } +(id)alloc { @synchronized([FirstViewController class]) { NSAssert(_singletonInstance == nil, @"Attempted to allocate a second instance of a singleton."); _singletonInstance = [super alloc]; return _singletonInstance; } return nil; } 

Luego agregué este código en mi SecondViewController para ejecutar el método changeLabel :

 [[FirstViewController singletonInstance] changeLabel]; 

Y eso parece funcionar bien hasta ahora. Espero que no cause ningún otro "problema" en el futuro, pero ahora parece perfecto.

Intente hacer esto:

 [label setNeedsDisplay]; 

Después de la última línea en changeLabel .