El método de llamada de otro UIViewController no tiene ningún efecto visible

Tengo dos classs y quiero llamar a un método de una class cuando se presiona un button. Lo declaro en mi file .h como sigue:

-(void) imageChange; 

Y creé el método en mi .m así:

 -(void)imageChange { UIImage *image = [UIImage imageNamed: img]; [_MyImage setImage:image]; } 

Finalmente, intenté llamar al método de otra class usando:

 - (IBAction)Done:(id)sender { SecondViewController *theInstance = [[SecondViewController alloc] init]; [theInstance imageChange]; [self dismissViewControllerAnimated:YES completion:nil]; } 

Sin embargo, cuando presiono "hecho" en mi controller de vista, el UIImage no cambia. Tenga en count: img es un valor NSString .

La pregunta es una variación común: "cómo pasar valores entre los controlleres de vista", y su código representa un bash común en una solución. Comencemos con lo que hiciste.

Su aplicación tiene dos controlleres de vista con vistas en la stack de vistas y desea comunicar algo entre ellos. Esta línea:

 SecondViewController *theInstance = [[SecondViewController alloc] init]; 

crea una nueva instancia de SecondViewController (alloc significa asignar memory para una nueva instancia de esta class). Esta línea:

 [theInstance imageChange]; 

le comunica algo, en su caso, parece configurar la image de una vista de image. Entonces esta línea:

 } 

implícitamente destruye esa nueva instancia, ya que nunca más se menciona. Entonces, su código logra comunicarse con un SecondViewController, pero con la instancia incorrecta, una instancia que vive solo unos pocos milisegundos.

De acuerdo, ¿qué hacer al respecto? Lo que @rmaddy estaba diciendo es ir a search la instancia existente de SecondViewController y comunicarse con eso. Cómo get esa instancia existente depende de cómo llegamos aquí. El dismissViewControllerAnimated en su código me hace pensar que este vc actual fue presentado por una instancia de SecondVC. Si es así,

 (SecondViewController *)self.presentingViewController 

apunta a lo que necesitas. Si estuviéramos en un UINavigationController , podrías cavar a través de viewControllers stack viewControllers , probablemente aquí:

 NSArray *stack = self.navigationController.viewControllers; SecondViewController *secondVC = stack[stack.count-2]; 

Pero, mientras que todo lo que podría ser la línea más recta de A a B, no es un layout muy bueno porque hace que este controller de vista actual dependa de manera frágil de cómo se presentó.

Por lo tanto, @CrimsonChris hace una buena sugerencia para considerar la delegación. Este es el patrón de ir a la mayoría de las personas para una vc que necesita comunicarse con otra. Hay muchos resources web y SO sobre cómo hacer esto, por lo que no repetiré aquí. Mira esto, por ejemplo , o google "delegación de iOS".

Hay otras forms, como NSNotificationCenter para transmitir a todos los interesados ​​en lo que se quiere comunicar, o KVO que le permite a SecondVC observar un cambio en su model y reactjsr, sin importar cómo o por qué se hizo ese cambio.

El concepto key para estos dos últimos es que su aplicación necesita tener un model, un set de objects que describa el estado de la aplicación. Los controlleres de vista no son el model, de hecho, no son exactamente el model. Su trabajo es aprender sobre los cambios de model y modificar las vistas en consecuencia.

Para su caso, el código que publicó no debe estar tratando de get una image establecida en el otro controller de vista, debería estar grabando en el model cualquier acción del usuario que haya ocurrido que desencadene el rechazo. Cuando este vc actual se descarta, SecondViewController (suponiendo que hizo el presente) obtendrá una vista WillWrap. Ese método podría ser un buen lugar para verificar la condición del model que se estableció en la acción del usuario. Entonces SecondViewController puede llamar a imageChange por sí mismo.

Espero que sea lo suficientemente claro. Buena suerte.