2012-04-12 5 views
0

Я работаю над этим несколько часов и становлюсь тупым. Я, вероятно, делаю что-то лишнее или глупое, что вызывает эту проблему, поэтому любая помощь, которую я могу получить, будет высоко оценена.iOS: NSXMLParser - Добавить значения атрибутов в UITableView

Я использую NSURL, чтобы вытащить сайт: http://undignified.podbean.com/feed. Отсюда я использую NSXMLParser для синтаксического анализа страницы XML и поиска элемента «enclosure» elementName. Элемент «enclosure» содержит атрибут «url», который содержит URL-адрес для Mp3. Парсинговая часть работает, и я могу NSLog из содержимого массива, и я проверил, что все доступные URL-адреса присутствуют, но я не могу заставить это загружать в UITableView, он просто загружается как пустой. Мой массив, в который загружаются значения атрибутов parsed out, в _podAllEntries будет записываться на консоль со значениями в dispatch_async, но когда любая другая часть моего ViewController обращается к этому массиву, она пуста. Я думаю, так как async вызывается в фоновом потоке, возможно, какой-то делегат должен быть реализован, чтобы другие методы могли получить доступ к значениям в этом массиве? Возможно, я ошибаюсь.

Подводя итог, я пытаюсь подключиться к RSS-каналу (xml-страница), проанализировать атрибут, называемый «url», и собрать его значение, а затем загрузить URL-адреса в tableView. Мой код приведен ниже. Пожалуйста, не стесняйтесь комментировать, если я неясен или неоднозначен ни на чем.

UnDigParser.h - класс используется для анализа http://undignified.podbean.com/feed

@interface UnDigParser : NSXMLParser <NSXMLParserDelegate> { 
} 
@property (retain) NSMutableArray *links; 
@end 

UnDigParser.h - файл реализации:

#import "UnDigParser.h" 


@implementation UnDigParser 
NSMutableArray *_links; 

@synthesize links = _links; 

-(void)parserDidStartDocument:(NSXMLParser *)parser{ 
_links=[[NSMutableArray alloc] init]; 
} 

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ 
if ([elementName isEqualToString:@"enclosure"]){ 

    NSString *link = [attributeDict objectForKey:@"url"]; 
    if (link){ 
     [_links addObject:link]; 
     } 
} 

}

-(BOOL)parse{ 
self.delegate = self; 
return [super parse]; 
} 

@end 

ViewController.h файл:

@interface getpodViewController : UITableViewController <UITableViewDataSource>{ 
NSMutableArray *_podAllEntries; 
NSMutableArray *_allEntries; 
} 

@property(retain) NSMutableArray *podAllEntries; 
@property(retain) NSMutableArray *allEntries; 

@end 

ViewController.M файл:

#import "getpodViewController.h" 
#import "PodcastEntry.h" 
#import "UnDigParser.h" 


@implementation getpodViewController 

@synthesize podAllEntries = _podAllEntries; 
@synthesize allEntries = _allEntries; 

-(void)addRows{ 
dispatch_async(dispatch_get_global_queue(0, 0), ^{ 

    NSURL *url = [NSURL URLWithString:@"http://undignified.podbean.com/feed"]; 
     UnDigParser *parser = [[UnDigParser alloc] initWithContentsOfURL:url];  

    [parser parse]; 
    [_podAllEntries addObject:parser.links]; 
    NSLog(@"%@", _podAllEntries); 

}); 

} 

- (void)viewDidLoad { 
[super viewDidLoad]; 


self.title = @"Podcasts"; 
self.podAllEntries = [[[NSMutableArray alloc]init]autorelease]; 


[self addRows]; 
for (UnDigParser *entry in _podAllEntries){ 
    [_allEntries insertObject:entry atIndex:0]; 
    [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] 
          withRowAnimation:UITableViewRowAnimationRight]; 
} 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
return [_podAllEntries count]; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if(cell==nil){ 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
} 

NSString *cellValue = [_podAllEntries objectAtIndex:indexPath.row]; 

cell.textLabel.text = cellValue; 

return cell; 
} 

- (void)dealloc { 
    [super dealloc]; 
[_podAllEntries release]; 
_podAllEntries = nil; 
} 

@end 
+0

Вопрос был фактически связан с методом cellForRowAtIndexPath. При попытке заполнить ячейки я использовал простой NSString для объекта NSMutableArray, который не разрешен. Изменен код: NSString * cellValue = [NSString stringWithFormat: @ "% @", _podAllEntries]; cell.textLabel.text = cellValue; Это заполняет ряд, но не все из них. Это улучшение по сравнению с предыдущим, поскольку приложение либо сбой, либо вообще ничего не отображает. Я создам новый вопрос, если я получу тупик. – Fostenator

ответ

0
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 

Попробуйте добавить это :)

+0

Спасибо :). Мне это не хватало, но, к сожалению, таблица все еще пуста. – Fostenator

+0

Вы настроили делегат делегатов (есть 2) для tableview? – Manuel

+0

Возможно, нет ... Можете ли вы объяснить, пожалуйста? – Fostenator

0

Этот вопрос был на самом деле связано с методом cellForRowAtIndexPath. При попытке заполнить ячейки я использовал простой NSString для объекта NSMutableArray, который не разрешен. Измененный код к следующему:

NSString *cellValue = [NSString stringWithFormat:@"%@", _podAllEntries]; 

cell.textLabel.text = cellValue; 
Смежные вопросы