Изображение не сохраняется из URL при использовании UIImage

"img" - это строка с URL-адресом, но я также использую ее в качестве имени файла

NSString *applicationDocumentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *storePath = [applicationDocumentsDir stringByAppendingPathComponent:img];

NSURL *url = [NSURL URLWithString:img];
NSData *imageData = [NSData dataWithContentsOfURL:url];  

[imageData writeToFile:storePath atomically:TRUE];

На мой взгляд контроллер я получил это:

UIImage *img = [[UIImage alloc] initWithContentsOfFile:self.initialImg];
if(img == nil) NSLog(@"image is nil");
[self.image setImage:img];

"initialImg" - это строка NSString с тем же URL-адресом, что и в "img". Я также изменил "img" и "initialImg" с другой строкой, такой как test.png, но это тоже не работает.

Он печатает "изображение ноль" и не уверен, почему это ноль...

РЕДАКТИРОВАТЬ:

Теперь я получил:

        NSURL *url = [NSURL URLWithString:img];
    NSData *imageData = [NSData dataWithContentsOfURL:url]; 

    UIImage *uiImage=[UIImage imageWithData:imageData];

    NSData *pngData = UIImagePNGRepresentation(uiImage);
    NSString *documentsPath  = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filePath = [documentsPath stringByAppendingPathComponent:@"image.png"]; 
    [pngData writeToFile:filePath atomically:YES];

И в другом контроллере представления в функции viewDidLoad:

    UIImage *img = [[UIImage alloc] initWithContentsOfFile:@"image.png"];
    if(img == nil) NSLog(@"image is nil");

   [self.image setImage:img];

Это все еще показывает мне "изображение ноль", и я изменил URL, но они правильные

2 ответа

Решение

Я думаю, что этого достаточно для вас...

NSString *applicationDocumentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *storePath = [applicationDocumentsDir stringByAppendingPathComponent:img];

NSURL *url = [NSURL URLWithString:img];
NSData *imageData = [NSData dataWithContentsOfURL:url];

[imageData writeToFile:storePath atomically:TRUE];

в viewDidLoad
// Вам нужен storePath, а не URL

NSData *imageData = [NSData dataWithContentsOfFile:storePath];
UIImage *image = [UIImage imageWithData:imageData];

За initWithContentsOfFile: Вы должны указать полный путь к файлу. Я думаю, что вы даете только имя файла.
Попробуйте кейс

NSString *initialImg= @"test.png";
NSString *imagePath = [[NSBundle mainBundle]pathForResource:initialImg ofType:@"png"];
UIImage *img = [[UIImage alloc] initWithContentsOfFile:imagePath];
if(img == nil) NSLog(@"image is nil");
[self.image setImage:img];

В противном случае вы можете использовать

self.image =[UIImage imageNamed:@"test.png"]

Но это вызывает проблемы с производительностью

Ответ на ваш вопрос

//Write image data into document directory  

NSData *pngData = UIImagePNGRepresentation(image);
NSString *documentsPath  = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"image.png"]; //Add the file name
[pngData writeToFile:filePath atomically:YES]; //Write the file


 // Read from directory using same file path 
NSData *pngData = [NSData dataWithContentsOfFile:filePath];
UIImage *image = [UIImage imageWithData:pngData];
Другие вопросы по тегам