2012-03-19 47 views
0

我有一个UIScrollView视图控制器与一堆UIImageViews作为子视图。有一个segue到另一个视图控制器,但我想重用已经在内存中的UIImages,而不是为了效率而重新加载它们。但是,如果我将新的UIImageView指向现有的UIImageView,则不会显示任何内容。(iOS)如何在其他视图中重用UIImageView?

我不得不使用中间指针变量(imageViewPointer),就好像我直接在prepareForSegue方法中指定它一样,每个视图控制器的NSLog都会显示不同的地址。此解决方法NSLogs显示相同的地址,但仍然没有显示。

如果我使用重新分配.image属性,而是显示图像,但来自第一个视图控制器的图像是异步加载的,因此.image属性可能会更改。

在第一个视图控制器

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 

    NextViewController *nextViewController = [segue destinationViewController]; 
    nextViewController.imageViewPointer = [[myScrollView subviews] objectAtIndex:myIndex]; 
    NSLog(@"%@", [[myScrollView subviews] objectAtIndex:myIndex]); 
} 

在第二视图控制器

@interface nextViewController : UIViewController 

@property (retain, nonatomic) IBOutlet UIImageView *imageView; 
@property (retain, nonatomic) UIImageView *imageViewPointer; 

@implementation nextViewController 

@synthesize imageView, imageViewPointer; 

{ 
    self.imageView = self.imageViewPointer; 

// [self.imageView setNeedsDisplay]; Doesn't help 

    NSLog(@"IMAGE VIEW POINTER = %@", self.imageViewPointer); 
    NSLog(@"IMAGE VIEW = %@", self.imageView); 

    [super viewDidLoad]; 
} 

回答

1

如果你只是将这样的一个观点,就不会出现当前视图中的视图层次控制者的观点。你需要做的是这样:

[self.view addSubview: imageView]; 

不过,我不会建议。最好将视图的图像分配给另一个视图的图像。

self.imageView.image = self.imageViewPointer.image; 
+0

'[self.view addSubview:imageView];'...即使UIImageView是在界面构建器中创建的? | 'self.imageView.image = self.imageViewPointer.image;'...这可以工作,但正如我所说的,图像是异步加载的(SDWebImage),所以如果用户速度太快,image属性将被设置为nil或一个占位符,我会得到一个指针。我希望通过重复使用同一个对象,图像在从网上加载时会更新,就像它在第一个视图控制器中一样。 – TijuanaKez 2012-03-19 05:52:21

+0

如果您使用SDWebImage,则应该使用'UIImageView(WebCache)''setImageWithURL:'方法。 – ThomasW 2012-03-19 06:08:43

+0

imageView没有什么特别之处,因为它是使用界面构建器创建的。 – ThomasW 2012-03-19 06:11:52

0

要么你重用UIImage或你正在做的方法是有点不对,你是分配给imageViewPointer其中imageView是(imageViewPointer)不是你的视图控制器的视图的子视图。因此,在分配imageViewPointer后添加子视图imageViewPointerimageView

+0

我不确定我是否正确理解你,但imageView是在界面生成器中创建的UIImageView的IBOutlet,所以它已经是主UIView的子视图。 imageViewPointer只是一个中间变量。我这样做是因为如果我直接从第一个视图控制器的prepareForSegue方法设置“nextViewController.imageView”属性,出于某种原因,NSLog中的地址不匹配。通过使用nextViewController.imageViewPointer作为中介,我得到所有NSLog的输出相同的地址,这是我想要的。 – TijuanaKez 2012-03-19 06:00:19

+0

看到您的imageView已连接到IB,但是当您将其重新分配给imageViewPointer时,您的xib UIImageView和imageView与您分配时不同。而你的新imageView不是你视图的子视图。 – 2012-03-19 06:06:27