Я использую NSXMLParser для получения новых историй RSS от канала и отображаю их в UITableView. Однако теперь я хочу взять ТОЛЬКО изображения и отобразить их в UIScrollView/UIImageView (3 изображения рядом). Я полностью потерян. Я использую следующий код для получения 1 изображения из URL.
NSURL *theUrl1=[NSURL URLWithString:@"http://farm3.static.flickr.com/2586/4072164719_0fa5695f59.jpg"];
JImage *photoImage1=[[JImage alloc] init];
[photoImage1 setContentMode:UIViewContentModeScaleAspectFill];
[photoImage1 setFrame:CGRectMake(0, 0, 320, 170)];
[photoImage1 initWithImageAtURL:theUrl1];
[imageView1 addSubview:photoImage1];
[photoImage1 release];
Это - все, что я выполнил, и это работает для одного изображения, и я должен указать точный URL. Что Вы рекомендовали бы, чтобы я сделал для выполнения этого?
, похоже, вам нужно сначала идентифицировать тег xml, который идентифицирует изображения в вашем XML-документе. вы должны иметь возможность сделать это, набрав любой вызов API, который вы используете, в адресную строку браузера.
Как только вы это сделаете, вы можете создать массив URL-адресов изображений из метода делегата nsxmlparser, который получает новые данные.
как только у вас есть массив URL-адресов изображений, вы можете сделать что-то похожее на то, что вы делаете выше, за исключением того, что вы должны использовать NSURL * theUrl1 = [myArray objectAtIndex: ...
вы можете упорядочить изображения, просто изменив их расположение центра: image.center = CGPointMake (160,240) ..
надеюсь, что это поможет. есть яблочная документация для nsxmlparser.
Вы также можете попробовать реализацию словаря при извлечении данных из Вызов API. Сначала вам нужно идентифицировать тег xml, который идентифицирует изображения в документе xml, затем вы можете назначить каждому изображению соответствующую историю в качестве ключа изображения в словаре. Он гарантирует, что для конкретной истории будет отображаться только связанное с ней изображение. Затем вы можете использовать эту информацию позже в своем приложении, поскольку требования меняются.
NSMutableDictionary * mutDict = [[NSMutableDictionary allloc] init]; if ([elementName isEqualToString: @ "story_image"]) { [mutDict setObject: currentImage forKey: currentStory]; }
Я хочу предложить вам использовать JSON вместо xml, поскольку это упрощенный формат обмена данными. Это также сэкономило бы много усилий и форматирования.
Вы можете посетить эту страницу http://code.google.com/p/json-frame
Это определенно поможет вы.
Вам нужно просто загрузить фреймворк, а затем использовать его в своем приложении.
Чтобы получить данные в реальном времени, вы должны сделать то же самое, что и в XMLParsing
NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSDictionary *JDict = [jsonString JSONValue];
или
NSArray * JArr = [jsonString JSONValue];
, в зависимости от того, что содержит ваш фид данных.
В дополнение к моему другому ответу, в котором используются некоторые вспомогательные классы и вроде бы предполагает, что вы храните данные с помощью Core Data, вот чистый способ NSXMLParser.
В этом примере я предполагаю, что у вас есть три настройки UIImageView с тегами (100,101,102), чтобы мы могли получить к ним доступ. Во-первых, код, запускающий синтаксический анализатор:
// Set the URL with the images, and escape it for creating NSURL
NSString *rssURLString = @"http://feeds.gettyimages.com/channels/RecentEditorialEntertainment.rss";
NSString *escapedURL = [rssURLString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
NSURL *rssURL = [NSURL URLWithString:escapedURL];
// rssParser is an NSXMLParser instance variable
if (rssParser) [rssParser release];
rssParser = [[NSXMLParser alloc] initWithContentsOfURL:rssURL];
[rssParser setDelegate:self];
success = [rssParser parse]; // return value not used
В этот момент начинается синтаксический анализ, и NSXMLParser запускает вызовы своих методов делегата, поскольку он находит разные начальные и конечные элементы в XML.
В этом примере я пишу только метод didStartElement
:
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
// look for an attribute called url
if ([attributeDict objectForKey:@"url"]) {
currentString = [attributeDict objectForKey:@"url"];
NSLog(@"Image URL: %@", currentString);
NSString* escapedURL = [currentString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:escapedURL]]];
UIImageView * tmpImageView = (UIImageView*)[scrollView viewWithTag:100+imageCount];
[tmpImageView setImage:image];
NSLog(@"images found: %d", imageCount);
imageCount++;
if (imageCount>2) [rssParser abortParsing];
}
}
Здесь мы проверяем, содержит ли attributeDict (объект NSDictionary) атрибут url. Если это так, мы захватываем его в currentString, а затем экранируем, на случай, если в нем есть символы, которые NSURL заблокирует. Затем мы создаем изображение из этого URL-адреса и устанавливаем соответствующее изображение UIImageView на основе номеров тегов. imageCount - счетчик; как только мы сделали три изображения, мы говорим NSXMLParser прервать синтаксический анализ XML.
Если ваш XML помещает URL в теги элементов, например:
<image>http://example.com/image.jpg</image>
, вам нужно будет немного поработать с didEndElement
и foundCharacters
.См. Прекрасное Introduction to Event-Driven XML Programming Guide for Cocoa .
Я собрал быстрое и грязное приложение для демонстрации этого, вы можете скачать его здесь .
Я сам использовал NSXMLParser и сохранял результаты с помощью CoreData. Я использую версию класса Parser Бьорна Салларпа из его кода CoreData example .
Мои изображения заканчиваются как NSData / Binary в базе данных SQLite, но с таким же успехом они могут быть помещены в массив UIImage для немедленного отображения.
Выдержка из Parser.m: (от Björn Sållarp)
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if ([elementName isEqualToString:@"imagetag"])
{
UIImage *newImage = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:currentString]]];
NSData *imageData = UIImagePNGRepresentation(newImage);
[currentSearchResult setImage:imageData];
currentString = nil;
return;
}
Вызывается с моей точки зрения с помощью:
NSString *searchURL = @"http://www.feedurl.com/feed/address/feed.xml";
NSURL *xmlURL = [NSURL URLWithString:searchURL];
Parser *xmlParse = [[Parser alloc] initWithContext:managedObjectContext];
[xmlParse parseXMLFileAtURL:xmlURL parseError:&parseError];
Этот код предполагает, что ваш XML-документ содержит URL-адреса изображений с форматом тега:
<imagetag>http://example.com/path/to/image.png</imagetag>
Даже если вы не используете CoreData, работа над примером по этой ссылке, будет инструкцией по обработке XML с помощью NSXMLParser.