我有2个ViewControllers,在第一个按钮下载图像,如何缓存此图像并发送到第二个ViewController?非常感谢。
First ViewController:
在.h
@interface asdViewController : UIViewController {
IBOutlet UIButton *actBtnGet;
}
@property (strong, nonatomic) IBOutlet UIImageView *ImageView;
@end
在.m
- (IBAction)actBtnGet:(id)sender {
id path = @"http://www.host.com/132.png";
NSURL *url = [NSURL URLWithString:path];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *img = [[UIImage alloc] initWithData:data];
self.ImageView.image=img;
}
答案 0 :(得分:2)
在第二个视图控制器中创建一个属性:
// inside your Second View Controller .h file
@property (nonatomic, strong) UIImage *storedImage;
然后在推送第二个视图控制器之前,设置storedImage:
// inside your First View Controller .m file
-(void)showSecondVC
{
SecondVC *secondVC = [[SecondVC alloc] init];
secondVC.storedImage = self.downloadedImage;
[self.navigationController pushViewController:secondVC animated:YES];
}
对于缓存机制,已经有两个很好的库已经提供了:
SDWebImage(https://github.com/rs/SDWebImage)
AFNetworking(https://github.com/AFNetworking/AFNetworking)
我个人更喜欢SDWebImage:D
将一个库导入项目之后,通常是一行代码,如下所示:
[myImageView setImageWithURL:imageURL placeholderImage:nil options:0 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
// do something here in the completion callback block
[self showSecondVC];
}];
如果图像检测到使用的URL地址相同,那么这两个库会缓存图像,所以如果你给它一个URL:
http://www.imageserver.com/someImage.png
第一次,它下载并缓存该地址的图像。第二次再次传递相同的URL地址时,它会从缓存中获取它而不是从服务器下载它。
SDWebImage有更多花哨的选项,可以使用下载管理器下载图像而不需要使用UIImageView,但是这通常适用于更复杂的场景,上述方法足以满足大部分时间。
答案 1 :(得分:1)
您可以在secondViewController中添加方法。
-(void)initWithImage:(UIImage *)image{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
//assign this image to a UIImage object
}
return self;
}
从First View Controller调用此方法
SecondVC *secondVC = [[SecondVC alloc] initWithImage:self.image];
[self.navigationController pushViewController:secondVC animated:YES];
答案 2 :(得分:0)
张说(虽然这不能称为缓存)或者如果您正在寻找可以缓存从Web下载的图像的图像缓存,请查看AFNetworking,它有一个很好的UIImageView类别。如上所述,传递到另一个视图控制器部分是正常的。
答案 3 :(得分:0)
我总是这样做(假设您使用segue进入第二个视图):
在第二个视图控制器.h文件中创建图像属性:
@property (strong, nonatomic) IBOutlet UIImageView *Image;
在第一个视图控制器中,在.m文件中使用它:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
//Use this if statement only if you have several segues coming from your first view, if so, you also need to add identifier to the segue you are using
if([segue.identifier isEqualToString:@"segueToSecondView"])
{
SecondViewController *secondView = segue.destinationViewController;
secondView.imageView.image = img;
}
}