iOS Загрузка изображения с URL-адреса

У меня возникают некоторые проблемы при загрузке UIImage из URL-адреса в UIImageView на iPhone. Когда я генерирую NSURL (с URL-адресом в аргументе метода NSURL URLWithString) с использованием свойств объекта, изображение вообще не извлекается, однако, если я жестко запрограммирую тот же URL-адрес, изображение извлекается и отображается, как ожидалось.
[Элемент valueForKey:@"pictureLocation"]; часть ниже, кажется, является причиной проблемы, потому что даже когда две жестко запрограммированные строки объединены, NSURl генерируется без проблем.

NSString * imagePath = @"http://localhost:3000";
NSString * specificPath = (NSString *)[item valueForKey:@"pictureLocation"] ;   
//concatenate the strings to get a fully formed URL
NSString * finalPath = [imagePath stringByAppendingString:specificPath];    

UIImage *img = [[UIImage imageWithData: [NSData dataWithContentsOfURL: [NSURL URLWithString:finalPath]]] retain];

По сути, когда я NSLog finalPath и вместо этого жестко вписываю этот URL в программу, я получаю ожидаемый результат.

Почему это может быть так?


person Community    schedule 18.08.2009    source источник


Ответы (3)


Как формируется NSString, возвращаемый valueForKey:? Это что-то вроде «image.png» или «/image.png»? Если это первое, вам нужно использовать stringByAppendingPathComponent: вместо stringByAppendingString:.

person Cinder6    schedule 18.08.2009
comment
Спасибо за ваш ответ... URL-адрес, сформированный из этого кода, правильный и отображает изображение при вводе в браузер... - person ; 19.08.2009
comment
Как выглядит строка URL после объединения строк? - person Cinder6; 19.08.2009
comment
он полностью сформирован и правильно разрешается в браузере: localhost:3000/pictures/picture.jpg - person ; 20.08.2009
comment
Так это @"localhost:3000..." или @"http://localhost:3000..."? Ваш первоначальный вопрос говорит о последнем, но убедитесь, что NSURL не будет работать без http://. Еще одна вещь, которую вы можете проверить, — это убедиться, что он правильно сохраняет порт — попробуйте метод port, который возвращает NSNumber. - person Cinder6; 20.08.2009
comment
Мой комментарий должен был иметь http:// в последней строке - забыл экранировать URL. - person Cinder6; 20.08.2009
comment
Спасибо за быстрый ответ. Приношу свои извинения, URL-адрес локального хоста должен иметь http:// перед ним.. на самом деле то, что я делаю, это жесткое кодирование localhost:3000 а затем добавить строку, полученную со страницы XML (/pictures/picture.jpg), и передать полученную строку в NSURL.... объединенная строка РАБОТАЕТ, если я просто передам ее непосредственно в NSURL (= источник путаницы) . - person ; 20.08.2009
comment
Метод viewdidload контроллера Subview: - (void)viewDidLoad { [super viewDidLoad]; imageView = [[UIImageView alloc] init]; NSString * imagePath = @localhost:3000; NSString * SpecificPath = (NSString )[item valueForKey:@picture] ; NSString * url = [imagePath stringByAppendingString:specificPath]; NSLog(@url =); НСлог (URL-адрес); //выводит правильный URL NSData imageData = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:url]]; UIImage* image = [[UIImage alloc] initWithData:imageData]; [изображение setImage:изображение]; [выпуск данных изображения]; [выпуск изображения]; } - person ; 20.08.2009
comment
Попробуйте сравнить конкатенированную строку с жестко закодированной версией (isEqualToString:), просто чтобы убедиться, что они точно такие же. Также убедитесь, что порт правильно установлен в объекте NSURL (метод порта). - person Cinder6; 20.08.2009
comment
странный! две строки не равны! Как я могу это исправить!? - person ; 20.08.2009
comment
хм, оказывается, из строки XML вернулись некоторые символы пробела. Я удалил их, и строки равны, но я получаю тот же результат. Также: NSString * port = [[nsurl port] stringValue]; NSLog(@urlport); NSLog(порт); ничего не печатает - person ; 20.08.2009
comment
Странный. Отличается ли кодировка объединенной строки от UTF8? Кроме того, для упрощения использования NSLog вы можете сделать что-то вроде NSLog(@%@, [url-порт]); Это как printf. - person Cinder6; 20.08.2009

Вам нужно использовать UIWebView и загрузить в него html <img />. По крайней мере, это хороший обходной путь.

Проверьте код здесь http://blog.timeister.com/2009/07/18/iphone-show-online-image/

- (void)loadImage:(NSString*)url frame:(CGRect)frame {
NSString* textHTML = @"
<html><head>
<style type=\"text/css\">
body {
background-color: transparent;
color: white;
}
</style>
</head><body style=\"margin:0\">
<img  src=\"%@\"  width=\"%0.0f\" height=\"%0.0f\"></img>
</body></html>";

NSString* html = [NSString stringWithFormat:textHTML, url, frame.size.width, frame.size.height];

if(webView == nil) {
webView = [[UIWebView alloc] initWithFrame:frame];
[self.view addSubview:webView];
}

[webView loadHTMLString:html baseURL:nil];
}

Адриан

person Adrian Pirvulescu    schedule 18.08.2009
comment
Я попробую это. Я запутался, потому что, когда я просто использую полный URL-адрес изображения непосредственно в методе [NSURL URLWithString], изображение появляется... - person ; 19.08.2009
comment
Тот факт, что он работает с жестко заданным URL-адресом, говорит о том, что проблема заключается в создании строки. Я думаю, что вы получите тот же результат с этим решением — вам нужно убедиться, что объект NSURL, созданный с помощью конкатенированной строки, не равен нулю. - person Cinder6; 20.08.2009

Я думаю, что проблема связана с правильной кодировкой.

попробуйте правильно закодировать параметры, используя следующую функцию:

encodedparams = [params stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];

Итак, в вашем случае:

NSString * specificPath = (NSString *)[item valueForKey:@"pictureLocation"] ;
specificPath = [specificPath stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];

Думаю, это решит вашу проблему.

person Gaurav Verma    schedule 27.01.2010