BarViewController と FooViewController の 2 つのコントローラーがあるとします。
FooViewController には、imageView と呼ばれる UIImageView へのアウトレットがあります。
@property (nonatomic, weak) UIImageView *imageView;
BarViewController には、UIButton ボタンへのアウトレットがあります。BarViewController には、このボタンから FooViewController へのセグエがあり、BarToFooSegue と呼ばれます (ストーリーボードで行われます)。
次のコードを実行し、FooViewController.imageView.image で NSLog を呼び出すと、結果は nil になり、画像が表示されません。これはなぜですか?
// 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;
デバッガーを実行すると、FooViewController の imageView が prepareForSegue: 内で正しく更新されていることに気付きますが、数行後に、@property イメージが nil に設定された新しく割り当てられた imageView に再更新されます。アセンブリ言語で記述された行で発生したため、制御フローのどの部分がこれを引き起こしているのかわかりません。
UIImage プロパティを FooViewController に追加することで、コードが機能するようになりました。
@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];
}