Проблемы с заполнением NSMutableArray данными, полученными NSXMLParser - PullRequest
0 голосов
/ 06 января 2012

Я работаю над своим первым довольно серьезным приложением для iOS, и я новичок в Xcode, iOS и Objective-C. Я следовал за ним и выполнил первые несколько заданий из iOS-класса Стэнфорда в iTunesU. Кроме этого у меня нет опыта.

В любом случае, я использую NSXMLParser для анализа XML-файла, полученного из Интернета, а затем пытаюсь создать объекты UGStory для представления некоторых данных и добавить их в NSMutableArray.

РЕДАКТИРОВАТЬ: я внес некоторые изменения в код и обновил его здесь. Теперь я уверен, что есть проблема с моими функциями NSXMLParser. Теперь, когда программа выполняется, я получаю 30 объектов в массиве, но когда я проверяю массив, каждый объект говорит «Out of Scope» и «Summary Unavailable».

Кроме того, эти данные используются для заполнения контроллера разделенного представления. Заголовки идут в masterview, ссылки используются для заполнения подробного просмотра. Но после этого в мастере остается только одна вещь; "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

1 Ответ

0 голосов
/ 06 января 2012

В этой строке:

_stories = [_stories initWithCapacity:10];

вы, вероятно, имели в виду:

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

В массиве nil все сообщения addObject: игнорируются.

Вы никогда не nil 'ing _currentTag после окончания элемента.

Добавьте этот код в конец вашего didEndElement:

[_currentTag release];
_currentTag = nil;

, и он должен работать как выожидается.

...