¿Por qué mi object no se pasa correctamente a través de Segue?

Diga que tengo 2 controlleres, BarViewController y FooViewController.

FooViewController tiene una salida a un UIImageView denominado imageView:

@property (nonatomic, weak) UIImageView *imageView; 

BarViewController tiene una salida a un button de UIB. BarViewController tiene un segue desde este button a FooViewController, llamado BarToFooSegue (hecho en storyboard).

Cuando ejecuto el siguiente código y llamo a NSLog en FooViewController.imageView.image, el resultado es nil y mi image no se mostrará. ¿Por qué es este el caso?

 // code in BarViewController - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ if([segue.identifier isEqualToString:@"BarToFooSegue"]){ NSURL *photoUrl = @"http://www.randurl.com/someImage"; // assume valid url UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:photoUrl]]; UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; [segue.destinationViewController setImageView:imageView]; } } 

He intentado configurar FooViewController.imageView a fuerte en lugar de débil, pero el problema sigue siendo:

 @property (nonatomic, strong) UIImageView *imageView; 

Al ejecutar mi depurador, noto que imageView en FooViewController se actualiza correctamente dentro de prepareForSegue: pero luego se actualiza unas cuantas líneas más tarde a una nueva image de image asignada con la image @property establecida en nil. No estoy seguro de qué parte del flujo de control está causando esto porque ocurrió en líneas escritas en lenguaje ensamblador.

Conseguí que mi código funcionara al agregar una propiedad UIImage a FooViewController:

 @property (nonatomic, strong) UIImage *myImage; 

y cambiar prepareForSegue: en BarViewController para pasar la image en lugar de imageView:

 // code in BarViewController - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ if([segue.identifier isEqualToString:@"BarToFooSegue"]){ NSURL *photoUrl = @"http://www.randurl.com/someImage"; // assume valid url UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:photoUrl]]; [segue.destinationViewController setMyImage:image]; } 

y modificando viewWillAppear: en FooViewController:

 - (void)viewWillAppear:(BOOL)animated{ [self.imageView setImage:self.myImage]; } 

Llamar [segue.destinationViewController view]; antes de configurar la image, esto hará que se cargue la jerarquía de vista y se establecerán sus salidas.

En prepareForSegue aún no están definidos, son nulos. Está enviando un post a cero, lo que está perfectamente bien y, por lo tanto, no le proporciona un error, pero en este caso puede provocar un comportamiento inesperado. Puede resolverlo creando una propiedad UIImage temporal y configure su vista de image para esa image en viewDidLoad o viewWillAppear.

Estoy de acuerdo con @ikuragames responder si debe configurar imageView.image directamente. Pero, por lo general, mantengo las jerarquías de vista de ViewControllers 'privadas.

No creo que sea feo agregar esa propiedad de UIImage a Foo. Creo que en realidad es más bonita que la solución correcta de @ikuragames.

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{  if([segue.identifier isEqualToString:@"BarToFooSegue"]){    NSURL *photoUrl = @"http://www.randurl.com/someImage";    UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:photoUrl]]; FooViewController *vc = [segue destinationViewController]; vc.myImage = image; } }