2011-09-29 28 views
6

Al implementar un cambio entre dos controladores de vista, ¿cómo cambiar una propiedad del controlador de vista de destino utilizando el objeto segue? La documentación dice que esto se puede hacer dentro del método prepareForSegue: sender: Lo intenté pero no fue exitosoiOS 5 implementación segue

Respuesta

13

No sé si necesita una respuesta a esto, pero fue una publicación tan solitaria, y si estoy en lo cierto, esto ya no cae dentro de NDA. Si estoy equivocado, por favor modere mi respuesta al olvido, así que aquí vamos: Acabo de terminar de hacer algo que utiliza lo que necesita. Este es el código que funciona para mí:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"relevantSegueIdentifier"]) 
    { 
     // [segue destinationViewController] is read-only, so in order to 
     // write to that view controller you'll have to locally instantiate 
     // it here: 
     ViewController *upcomingViewController = [segue destinationViewController]; 

     // You now have a solid reference to the upcoming/destination view 
     // controller. Example use: Allocate and initialize some property of 
     // the destination view controller before you reach it and inject a 
     // reference to the current view controller into the upcoming one: 
     upcomingViewController.someProperty = [[SomePropertyClass alloc] initWithString:@"Whatever!"]; 
     upcomingViewController.initialViewController = [segue sourceViewController]; 
     // Or, equivalent, but more straightforward: 
     //upcomingViewController.initialViewController = self; 
    } 
} 

Esto supone que tanto someProperty y initialViewController son descriptores de acceso del controlador de vista de destino sintetizados. ¡Espero que esto ayude!

+0

cae bajo NDA pero en 3 días no será el lanzamiento oficial el 14 de octubre, pero me gusta tu respuesta +1 –

+0

intenté con lo que dices pero las propiedades en mi 'destinationViewController' no se actualizan . ¿Algún consejo? – Francesco

+0

Supongo que utiliza un acceso sintetizado (no un ivar privado) del controlador de vista de destino y que el controlador de vista ya está instanciado durante la configuración de la aplicación (es decir, el guión gráfico con controladores de vista reales colocados en él, un intervalo entre ellos lanzamiento). En ese caso, debería funcionar. Podría ser algo así como que el sistema no conozca su destino específico. ver clase de controlador. La clase ViewController en mi ejemplo es una subclase de UIViewController, y antes de @implementation hago algo como '#import' ViewController.h "'. Podría ser una de estas cosas? – DarqueSandu

0

Lo que yo uso en el controlador de vista de origen es:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    UIViewController *upcomingViewController = [segue destinationViewController]; 
    upcomingViewController.view.tag = [[segue identifier] hash]; 
} 

Y luego en el controlador de vista de destino que uso (utilización por ejemplo en el viewDidAppear)

if(self.view.tag == [@"MySeqgueIdentifier" hash]) 
{ 
    // Do something here... 
} 

Esto es muy bueno, ya no es necesario crear ninguna propiedad, etc. y todo funciona bien desde el constructor de interfaces.