为什么我只查看iphone中url中xml文件中最后一个元素的UIImage



当我从URL检索XML文件时,我可以解析XML文件中的所有元素并在日志文件中查看,我的解析代码如下,

-(id) loadXMLByURL:(NSString *)urlString{
tweets  = [[NSMutableArray alloc] init];
NSURL *url = [NSURL URLWithString:urlString];
NSData *data = [[NSData alloc] initWithContentsOfURL:url];
parser = [[NSXMLParser alloc] initWithData:data];
parser.delegate = self;
[parser parse];
return self;}

-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
if([elementName isEqualToString:@"Products"]){
currentTweet = [egsBase alloc];}}

-(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if([elementName isEqualToString:@"img"]){
currentTweet.img=[UIImage imageWithData: [NSData dataWithContentsOfURL: [NSURL URLWithString:currentNodeContent]]];}
if ([elementName isEqualToString:@"Products"]) {
[tweets addObject:currentTweet.img];
currentTweet = nil;
currentNodeContent = nil;}}

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];}

我使用类名作为XmlParsing进行解析。在控制器类中,我已经将类文件XmlParsing实现为XmlParsing xmlparser;。现在在viewDidLoad()函数中,我使用这样的代码,

- (void)viewDidLoad{
[super viewDidLoad];
xmlParser = [[XMLParsing alloc] loadXMLByURL:@"http://images.com/Products.xml"];
UIImage *currentImage = [[xmlParser tweets] objectAtIndex:0];
customimage.image = currentImage;}

这里的customimage是UIImageView的参考,现在的问题是我只能获得最后一个元素值,并在故事板中连接的UIImageView中显示(即)为了更好地理解它只显示最后一个元件图像,而不显示我在元件中使用的前一个元件。如何解决这个问题?我哪里做错了。请推荐我。

XML的结构

<Products>
<products id="1">
<img>http://images.com/images/Main_pic.png</img>
</products>
<products id="2">
<img>http://images.com/images/image1.png</img>
</products>
</Products>

我的NSLog显示用于解析XML文件,

images <UIImage: 0x71529a0>
images <UIImage: 0x74a6750>

当我打印以检查我得到的图像时,它将当前图像显示为

Current,<UIImage: 0x74a6750>

在这里你可以看到当前的图像显示的是最后一个元素,而不是前一个

- (void)viewDidLoad
{
1) [super viewDidLoad];
2) xmlParser = [[XMLParsing alloc] loadXMLByURL:@"http://images.com/Products.xml"];
3) UIImage currentImage = [[xmlParser tweets] objectAtIndex:0];
4) customimage.image = currentImage;
}

为了便于理解,我添加了行号:

第3行:你总是得到一个新的图像(我说得对吗?)

第4行:每当你得到一个新图像时,你都会将该图像设置为相同的imageview(自定义图像)由于之前的图像被替换新的。

理想情况下,您应该将每个新图像设置为各自的图像视图。

如果您试图在表视图中加载这些图像---则图像视图的名称保持不变,但实际上对象不同,因此您应该通过在cellForRowAtIndexPath中分配的TAG访问每个单元格的图像视图。

更新的代码

-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{
if([elementName isEqualToString:@"products"])
{
currentTweet = [egsBase alloc];}}
}
-(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if([elementName isEqualToString:@"img"])
{
currentTweet.img=[UIImage imageWithData: [NSData dataWithContentsOfURL: [NSURL URLWithString:currentNodeContent]]];
[tweets addObject:currentTweet.img];
}
if ([elementName isEqualToString:@"products"])
{
currentTweet = nil;
currentNodeContent = nil;
}
}

描述:在解析时,当"products"被找到作为开始元素并创建对象时,以及当结束元素被找到时,图像被关联到对象并添加到数组中。我看到的错误是:你在解析条件下使用"产品",而不是"产品">

希望这个想法能有所帮助:)

将字符串附加到当前节点内容

if(!currentNodeContent ) 
currentNodeContent = [[NSMutableString alloc] initWithString:string];
else
[currentNodeContent appendString:string];

最新更新