UIImage из-за проблемы с файлом

#iphone #xcode #ios #uiimage

#iPhone #xcode #iOS #uiimage

Вопрос:

Я пытаюсь загрузить сохраненное изображение, но когда я проверяю UIImage, оно возвращается с нулевым значением. Вот код:

 UIImage *img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"/var/mobile/Applications/B74FDA2B-5B8C-40AC-863C-4030AA85534B/Documents/70.jpg" ofType:nil]];
  

Затем я проверяю img, чтобы увидеть, равно ли оно нулю, и это так. В списке каталогов показан файл, что я делаю не так?

Ответ №1:

Вам нужно указать на каталог Documents в вашем приложении, затем вот так:

 - (NSString *)applicationDocumentsDirectory
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    return basePath;
}
  

Использование:

 UIImage *img = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/70.jpg",[self applicationDocumentsDirectory]]];
  

Ответ №2:

Во-первых, вы неправильно используете pathForResource, правильным способом было бы:

 [[NSBundle mainBundle] pathForResource:@"70" ofType:@"jpg"]
  

Вся идея объединения заключается в том, чтобы абстрагировать путь к ресурсу таким образом, чтобы он всегда был действительным, независимо от того, где в системе находится ваше приложение. Но если все, что вы хотите сделать, это загрузить это изображение, я бы порекомендовал вам использовать imageNamed: поскольку он автоматически обрабатывает обнаружение отображения с разрешением retina (высокое разрешение) на iPhone для вас и загружает соответствующий ресурс «автоматически»:

 UIImage *img = [UIImage imageNamed:@"70.jpg"];
  

Чтобы легко поддерживать обычное разрешение и разрешение retina, вам потребуется два ресурса в вашем пакете приложений, 70.jpg и 70@2x.jpg при этом ресурс @2x удвоился как по размеру, так и по высоте.

Комментарии:

1. Проблема с вашим решением заключается в том, что UIImage ищет jpg в пакете приложений, где-поскольку ему это нужно из каталога документов приложения.

Ответ №3:

Попробуйте загрузить UIImage с:

 [UIImage imageNamed:@"something.png"]
  

Выполняется поиск изображения с указанным именем в основном пакете приложения. Также приятно: он автоматически выбирает сетчатку (xyz@2x.png ) или версии, отличной от Retina (xyz.png).

Комментарии:

1. У меня была проблема с изображениями сетчатки, и это решило мою проблему. Большое спасибо.

Ответ №4:

Ваш путь просто не будет работать, потому что ваше приложение находится в изолированной среде, и вы пытаетесь использовать полный путь.

Вместо этого вы должны использовать следующее:

UIImage *img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"70" ofType:@"jpg"]];

или вы можете использовать, но работает медленнее, чем вышеупомянутый:

UIImage *img = [UIImage imageNamed:@"70.jpg"];

Комментарии:

1. Спасибо за ответ, я попробовал оба из них и все еще получаю ноль, когда делаю: if (img == nil) {NSLog(@»равно нулю»);} Я начинаю задаваться вопросом, сохраняю ли я его неправильно.

2. Я вижу в своем каталоге Documents «70.jpg «существует. Это то, что вы имеете в виду, я немного запутался с «вашим пакетом». Еще раз спасибо.

3. Проверьте файлы вашего проекта, и вы также можете открыть файл .app, чтобы убедиться, что ресурс был скопирован. Скорее всего, файл не включен в ваш проект, если бы он был, то приведенный мной образец сработал бы.

4. Я снимаю изображение с камеры и сохраняю его в каталоге Documents.