2012-01-06 48 views
0

我正在研究我的第一个有点严肃的iOS应用程序,我是Xcode,iOS和Objective-C的新手。我一直遵循,并且在iTunesU上完成了斯坦福大学iOS课程的前几个任务。除此之外,我没有经验。用NSXMLParser检索到的数据填充NSMutableArray问题

无论如何,我正在使用NSXMLParser来解析从互联网检索到的XML文件,然后我试图创建UGStory对象来表示一些数据并将它们添加到NSMutableArray中。

编辑:我做了一些更改的代码,并在这里更新它。现在我确定我的NSXMLParser函数有问题。现在,当程序执行结束时,数组中有30个对象,但是当我检查数组时,每个对象都会显示“超出范围”和“不可用摘要”。

此外,此数据正用于填充分割视图控制器。标题进入主视图,链接用于填充detailview。但是在执行之后,主人只有一件事。 “News @ Ultimate-Guitar.Com”

这是第一个由标题包含的文本,此时标题还没有被遇到。正因为如此,我不应该有UGStory对象,所以我很困惑这个单元格是如何设置的。此外,阵列中的所有内容都是“超出范围”,因此控制器从哪里获取此数据?控制器除了创建一个UGFeedReader并发送parseFeed消息外,

#import "UGFeedReader.h" 

@implementation UGFeedReader 

@synthesize currentTag = _currentTag; 
@synthesize stories = _stories; 
@synthesize read = _read; 
@synthesize i = _i; 

- (void)parseFeed 
{ 
    NSURL* ugFeed = [NSURL URLWithString:@"http://www.ultimate-guitar.com/modules/rss/news.xml.php"]; 
    NSXMLParser* feedParser = [[NSXMLParser alloc]initWithContentsOfURL:ugFeed]; 
    _stories = [[NSMutableArray alloc] initWithCapacity:10]; 
    _i = 0; 
    _read = NO; 

    [feedParser setDelegate:self]; 
    [feedParser parse]; 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { 

     if ([elementName isEqualToString:@"item"]) 
     { 
      _read = YES; 
      UGStory* temp = [[UGStory alloc] init]; 
      [_stories addObject:temp]; 
     } 
    return; 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if (!_currentTag) 
    { 
     _currentTag = [[NSMutableString alloc] init]; 
    } 
    [_currentTag appendString:string]; 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if (_read == YES) 
    { 
     if ([elementName isEqualToString:@"title"]) { 
      UGStory* temp = [_stories objectAtIndex:_i]; 
      temp.title = _currentTag; 
     } 
     if ([elementName isEqualToString:@"link"]) { 
      UGStory* temp = [_stories objectAtIndex:_i]; 
      temp.url = [NSURL URLWithString:_currentTag]; 
      _read = NO; 
      _i++; 
     } 
    } 
     return; 
} 

@end 

回答

0

在此行中:

_stories = [_stories initWithCapacity:10]; 

你可能是指:

_stories = [[NSMutableArray alloc] initWithCapacity:10]; 

在一个nil阵列的所有addObject:消息被忽略。

你从来没有nil'ing _currentTag结束元素后。

将此代码添加到您的didEndElement:

[_currentTag release]; 
_currentTag = nil; 

结束,如你预期它应该工作。

+0

好的,谢谢。这绝对是一个问题,但单独解决这个问题并不适合我。我编辑了代码和我的OP。任何进一步的帮助将非常感激。 – evanmcdonnal 2012-01-06 04:17:14

+0

我刚刚运行了你的代码,发现了另一个错误。编辑 – 2012-01-06 04:31:57

+0

好的谢谢。我有点怀疑那里。我不能使用发布,因为我正在做自动引用计数,如果我只是将它设置为零将具有相同的效果?我以前曾尝试使用setString消息而不是在foundCharacters中添加appendString来纠正这个问题,但它没有奏效。 它现在似乎工作,但我不能完全确定。感谢Inglese的帮助。 – evanmcdonnal 2012-01-06 04:44:44