使用NSXMLParser检索的数据填充NSMutableArray时出现问题

时间:2012-01-06 02:08:21

标签: ios xcode nsmutablearray nsxmlparser

我正在研究我的第一个有点认真的iOS应用程序,我是Xcode,iOS和Objective-C的新手。我跟着并完成了斯坦福在iTunesU上的iOS课程的前几个任务。除此之外,我没有经验。

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

编辑:我对代码进行了一些更改并在此处进行了更新。现在我确定我的NSXMLParser函数存在问题。现在,当程序执行时,我最终得到了数组中的30个对象,但是当我检查数组时,每个对象都显示“Out of Scope”和“Summary Unavailable”。

此外,此数据用于填充拆分视图控制器。标题进入主视图,链接用于填写详细视图。但是在执行之后,主人只有一件事; “新闻@ 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

1 个答案:

答案 0 :(得分:0)

在这一行:

_stories = [_stories initWithCapacity:10];
你可能意味着:

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

nil数组上,忽略所有addObject:条消息。

结束元素后,您永远不会nil'_currentTag

将此代码添加到didEndElement:

的末尾
[_currentTag release];
_currentTag = nil;

它应该按预期工作。