說我有2個控制器,BarViewController和FooViewController。爲什麼我的對象沒有通過segue正確傳遞?
FooViewController具有出口到一個UIImageView稱爲ImageView的:
@property (nonatomic, weak) UIImageView *imageView;
BarViewController具有出口到一個UIButton按鈕。 BarViewController具有此按鈕FooViewController一個SEGUE,叫BarToFooSegue(在故事板完成)。
當我運行下面的代碼,並調用的NSLog上FooViewController.imageView.image,結果是零,我的形象將不會顯示。爲什麼會這樣?
// 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正確更新:但然後在幾行後重新更新爲一些新分配的imageView,並將@property圖像設置爲nil。我不確定控制流程的哪一部分會導致這種情況,因爲它發生在用匯編語言編寫的行中。
我得到了我的代碼中加入一個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];
}
+1。並投下它(無效)並寫出一個好評。 :-) – danh
這真的是一個很好的解決方案嗎?如果內存不足,視圖控制器的視圖可隨時卸載,並在需要時再次重新加載。因此,在'viewDidLoad'中設置'imageView'似乎是更強大的解決方案。 –
我認爲這是一個慎重使用的實用解決方案。與任何模式一樣,當然可以濫用和濫用。情況似乎是imageView是一個目的地並不關心的裝飾的容器,所以添加一個屬性來臨時存儲UIImage,然後在viewDidLoad中設置它看起來像是一個過於複雜的小語義值。該視圖會加載,因爲你正在準備一個segue - 迫使它稍早加載,避免了必須編寫膠水代碼。 – ikuramedia