在保存在文档目录中的表格视图中显示图像

Posted

技术标签:

【中文标题】在保存在文档目录中的表格视图中显示图像【英文标题】:displaying image in table view which is saved in document directory 【发布时间】:2013-03-26 07:39:11 【问题描述】:

我已使用以下代码将图像保存在文档目录中,并且图像成功保存在文档目录中

UIImage *image =[[UIImage alloc ]init ];
 image = [UIImage imageNamed:@"PlaceHolder.png"];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString* path = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithString: @"PlaceHolder.png"] ];
    NSData* data = UIImagePNGRepresentation(image);
    [data writeToFile:path atomically:YES];

现在我想在表格视图中显示图像 在我的表格视图中,一些图像从 facebook url 显示,这就是我使用以下代码的原因

NSString *path = [[_arrayForTable valueForKey:@"URL"] objectAtIndex:[indexPath row]];

NSURL *url = [NSURL URLWithString:path];
AsyncImageView *imageView = [[[AsyncImageView alloc] init] autorelease];
imageView.frame = CGRectMake(0, -5, 45, 45);
imageView.imageURL=url;

_arrayForTable 是 Dic 数组,它包括 URL,一些链接来自 facebook,一些来自文档目录

现在我的问题如下

** 只有 facebook 图片显示在表格视图中,但文档目录图片未显示**

我已检查位置对于图像完全正确,但现在正在显示

【问题讨论】:

把图片显示的代码放到documents目录下.. 我从未使用过 AsyncImageView 类,但根据我的经验,在目录中找到的图像应使用 [[UIImage alloc] initWithContentsOfFile:filePath] 加载。 但是有些图片是从 url 显示的,那么怎么做一些来自 url,一些来自 uiimage? 你不需要Async imageview,即使它是从一个url显示的......你可以直接显示它 男人然后表格视图不会平滑需要懒惰的loding 【参考方案1】:
NSURL *url = [NSURL URLWithString:path];

这在您的代码中是错误的。用这行代码替换它。

NSURL *url = [NSURL fileURLWithPath:path];

检查文件是否存在于您的文档目录中

if([[NSFileManager defaultManager] fileExistsAtPath:path])
    NSURL *url = [NSURL fileURLWithPath:path];

如果图像正在保存,请检查您的文档目录。像这样为您提供图像的名称

image = [UIImage imageNamed:@"PlaceHolder.png"];

因此,如果您重复这一行,您的图像将被覆盖在文档目录中。

你也可以在这里打勾 BOOL 成功 = [数据 writeToFile:path atomically:YES];

if(success)
   NSLog(@"image written successfully");
else
   NSLog(@"image writing failed");

希望我能帮上忙。

【讨论】:

【参考方案2】:

在您的 .m 文件中

@interface YourClass ()<NSURLConnectionDelegate>
@property (nonatomic, copy) NSMutableData *receivedImageData;
@end

@implementation YourClass

- (void)init 
    if (self = [super init]) 
        // Do your init stuff
        _receivedImageData = [[NSMutableData alloc] initWithCapacity:0];
    


// A method to start your connection
- (void)startDownloadingImage 
    NSMutableURLRequest *downloadImageRequest = [[NSMutableURLRequest alloc] init];
    downloadImageRequest.URL = [NSURL URLWithString:@"http://www.theImage.you/want/to/download.extension"];
    downloadImageRequest.HTTPMethod = @"GET";
    [NSURLConnection connectionWithRequest:downloadImageRequest delegate:self];



// You need the following delegate methods
#pragma mark -
#pragma mark NSURLConnection delegate methods

- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse 
    return request;


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 

    // This method is called frequently ... you can see if you log
    // NSLog(@"I am downloading");
    [self.receivedImageData appendData:data];


- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
    // Log an error or do whatever you want ;)


- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
    // Create your picture here using
    UIImage *image = [UIImage imageWithData:self.receivedImageData scale:1.0];
    // Only if there is an image display the downloaded image
    if (CGSizeEqualToSize(self.imageView.image.size, CGSizeZero)) 
        self.imageView.image = image;
    

您可以尝试下载图片,如果没有图片可以继续显示 PlaceHolder.png 确保您复制图像并且它确实在您的项目目录中

// self.imageView is an UIImageView
self.imageView.image = [UIImage imageNamed:@"PlaceHolder.png"];
[self startDownloadingImage];

如果对你有帮助,请告诉我 ;)

【讨论】:

【参考方案3】:

您是否检查了文档目录图像的图像数据不为零?您必须通过正确的路径检索图像并确保您提供正确的位置

【讨论】:

我已经检查过了。有图像,是的,路径完全正确【参考方案4】:

AsyncImageViewUIImageView 的子类。使用initWithContentsOfFile:filePath 加载图像后,您可以简单地设置image 属性。您只需弄清楚要从目录中加载哪些图像,以及从网络加载哪些图像。

【讨论】:

【参考方案5】:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [[_arrayForTable valueForKey:@"URL"] objectAtIndex:[indexPath row]];

NSURL *url = [NSURL URLWithString:path];
if ([path rangeOfString:documentsDirectory].location != NSNotFound)
    url = [NSURL fileURLWithPath:path isDirectory:NO];

AsyncImageView *imageView = [[[AsyncImageView alloc] init] autorelease];
imageView.frame = CGRectMake(0, -5, 45, 45);
imageView.imageURL=url;

【讨论】:

【参考方案6】:

Asynchimageview 是否支持从文档目录或带有图像 url 的包加载图像??..尝试先从包中加载图像。最近我遇到了类似的问题,最终从服务器本身加载了一个占位符。

与其他一些答案一样,您可以先创建一个 UIImage 对象,并将 initWithContentsOfFile: 设置为 asynchimageView.image

【讨论】:

以上是关于在保存在文档目录中的表格视图中显示图像的主要内容,如果未能解决你的问题,请参考以下文章

将目录中保存的图像显示到集合视图

Iphone:如何在图像视图中显示文档目录图像?

Swift:在表格视图中显示 UIImage 数组中的图像

无法从 iPhone 文档目录位置中的已保存文件重新加载 UIImage

表格视图单元格中的滚动视图将无法正确显示图像,并且在 swift 4 中的分页模式下有一个额外的页面

加载保存到文档目录的图像只能工作一次,然后永远不会再次加载