2010-03-18 81 views
5

我正在使用NSXMLParser從訂閱源獲取新的RSS故事,並將它們顯示在UITableView中。但是現在我只想拍攝這些圖像,並將它們顯示在UIScrollView/UIImageView中(3幅圖像並排)。我完全失去了。我正在使用以下代碼從URL中獲取1個圖像。iPhone開發:從RSS訂閱源獲取圖像

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。你會推薦我做什麼來完成這件事?

回答

0

聽起來好像您需要首先識別標識xml文檔中圖像的xml標籤。您應該可以通過在瀏覽器地址欄中輸入正在使用的任何API調用來完成此操作。

一旦你這樣做了,你可以從接收新數據的nsxmlparser委託方法中創建一個映像URL數組。

一旦你的陣列圖像的URL,你可以做同樣的事情,以你在做什麼,所不同的是,你會用NSURL * theUrl1 = [myArray的objectAtIndex:...

你可以通過安排圖像改變他們的中心位置:image.center = CGPointMake(160,240)..

希望有幫助。有nsxmlparser的蘋果文檔。

+0

URL是動態的,因爲我使用的是feedburner,這可以與「any」rss feed一起使用嗎?謝謝! – 2010-03-19 20:47:58

+0

不確定你的意思是'網址是動態的'。但只要在xml文檔中有一個標籤來標識圖像url,就應該適用於任何xml文檔。 – Remover 2010-03-20 20:47:18

+0

由此我的意思是所有的圖像託管在不同的地方... – 2010-03-26 19:57:41

0

您還可以在從API調用中獲取數據時嘗試字典實現。首先,您必須識別xml標籤,用於識別xml文檔中的圖像,然後您可以將每個圖像及其相應的故事作爲圖像的關鍵字分配到字典中。它將確保對於特定的故事只顯示其關聯的圖像。然後,隨着需求的變化,你可以稍後在應用程序中使用這些信息。

NSMutableDictionary * mutDict = [[NSMutableDictionary allloc] init]; if([elementName isEqualToString:@「story_image」]) {[mutDict setObject:currentImage forKey:currentStory]; }

我想建議您使用JSON而不是xml,因爲它是輕量級數據交換 格式。這將節省很多格式和努力。

+0

我絕對願意給JSON一個嘗試,但是我不知道該怎麼做。笑 – 2010-03-26 19:57:08

+0

你可以訪問此頁面 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]; 取決於您的數據源包含的內容。 – 2010-03-30 07:53:45

0

您可以訪問此頁面 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]; 

取決於你的數據Feed中包含。

+0

我已經將JSON框架添加到了我的項目中,但是我不知道我會如何從RSS提要中提取圖像......您可以通過電子郵件發送消息來消除StackOverflow中間人?我的地址是[email protected]謝謝 – 2010-03-31 00:29:51

0

我一直在使用NSXMLParser並使用CoreData存儲結果。我使用他的CoreData example代碼中的BjörnSållarp的分析器類的一個版本。

我的圖像在SQLite數據庫中以NSData/Binary結尾,但它們也可能放入UIImage數組中以便立即顯示。從Parser.m

提取:(由比約恩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文檔中包含圖片網址與標籤格式:

<imagetag>http://example.com/path/to/image.png</imagetag> 

即使你不使用CoreData,通過該鏈接的示例工作將是使用NSXMLParser處理XML的指導。

3

除了我的另一個答案,它使用了一些輔助類,並假設你正在存儲的東西與核心數據,這是一個純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> 

你需要做更多的工作與didEndElementfoundCharacters。看到相當優秀的Introduction to Event-Driven XML Programming Guide for Cocoa

我敲了一個快速和骯髒的應用程序來演示這個,你可以抓住它here