为什么我的对象不能通过segue正确传递?

说我有2个控制器,BarViewController和FooViewController。

FooViewController有一个名为imageView的UIImageView插件:

@property (nonatomic, weak) UIImageView *imageView; 

BarViewController有一个UIButtonbutton的sockets。 BarViewController有一个从这个button到FooViewController的inheritance,名为BarToFooSegue(在storyboard中完成)。

当我运行下面的代码,并在FooViewController.imageView.image上调用NSLog时,结果为零,我的图像将不会显示。 这是为什么?

 // 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]; } } 

我试图设置FooViewController.imageView强而不弱,但问题依然存在:

 @property (nonatomic, strong) UIImageView *imageView; 

运行我的debugging器,我注意到FooViewController中的imageView已经在prepareForSegue中正确更新了:但是之后几行重新更新了一些新分配的imageView,它的@property图像被设置为nil。 我不确定控制stream程的哪一部分是由于它以汇编语言编写的行发生的。

我通过向FooViewController添加一个UIImage属性来获得我的代码:

 @property (nonatomic, strong) UIImage *myImage; 

和改变prepareForSegue:在BarViewController传递图像,而不是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]; } 

并修改viewWillAppear:在FooViewController中:

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

调用[segue.destinationViewController view]; 在设置图像之前,这会导致视图层次结构被加载,然后您的网点将被设置。

prepareForSegue网点尚未定义 – 他们是零。 你发送消息给零,这是完全正确的,因此不会给你一个错误,但在这种情况下,它可能会导致意外的行为。 你可以通过创build一个临时的UIImage属性来解决这个问题,并在viewDidLoad或viewWillAppear中将图像视图设置为该图像。

我同意@ikuragames答案,如果你必须直接设置imageView.image。 但通常,我保持我的ViewControllers的视图层次结构私人。

我不认为将UIImage属性添加到Foo并不难。 我认为它比@ikuragames正确的解决scheme更漂亮。

 - (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; } }