2012-04-12 9 views
0

Ich habe seit mehreren Stunden daran gearbeitet und bin ratlos geworden. Ich mache wahrscheinlich etwas überflüssiges oder dummes, das dieses Problem verursacht, also würde jede Hilfe, die ich bekommen kann, sehr geschätzt werden.iOS: NSXMLParser - Hinzufügen von Attributwerten zu UITableView

Ich benutze NSURL, um eine Website zu ziehen: http://undignified.podbean.com/feed. Von hier aus verwende ich NSXMLParser, um die XML-Seite zu analysieren und nach dem Element "enclosure" zu suchen. Das Element "enclosure" enthält ein Attribut "url", das die URL für ein MP3 enthält. Der Parsing-Teil funktioniert und ich kann den Inhalt des Arrays aus NSLoggen und ich habe überprüft, dass alle verfügbaren URLs vorhanden sind, aber ich kann das nicht in ein UITableView laden, es wird einfach als leer geladen. Mein Array, in das ich die analysierten Attributwerte in _podAllEntries geladen habe, wird mit den Werten in dispatch_async in der Konsole protokolliert, aber wenn irgendein anderer Teil von ViewController auf dieses Array zugreift, ist es leer. Ich denke, da das Async auf einem Hintergrundthread aufgerufen wird, dass möglicherweise eine Art Delegat implementiert werden muss, damit andere Methoden auf die Werte in diesem Array zugreifen können? Ich könnte jedoch völlig falsch liegen.

Zusammenfassend Ich versuche, eine Verbindung zu einem RSS-Feed (XML-Seite), für ein Attribut namens "URL" analysieren und sammeln Sie den Wert, und laden Sie dann die URLs in eine Tabelle. Mein Code ist unten aufgeführt. Bitte zögern Sie nicht zu kommentieren, wenn ich unklar oder mehrdeutig bin.

UnDigParser.h - Klasse verwendet http://undignified.podbean.com/feed

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

UnDigParser.h zu analysieren - Implementierungsdatei:

#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 Datei:

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

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

@end 

ViewController.M Datei:

#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

Das Problem wurde tatsächlich mit der CellForRowAtIndexPath-Methode verwandt. Beim Versuch, die Zellen zu füllen, verwendete ich einen einfachen NSString für ein NSMutableArray-Objekt, das nicht erlaubt ist. Geänderter Code wie folgt: NSString * cellValue = [NSString stringWithFormat: @ "% @", _podAllEntries]; cell.textLabel.text = Zellenwert; Dies füllt eine Zeile, aber nicht alle von ihnen. Das ist eine Verbesserung gegenüber früher, da die Anwendung entweder abstürzen würde oder gar nichts anzeigen würde. Ich werde einen neuen Fragethread erstellen, wenn ich ratlos bin. – Fostenator

Antwort

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

versuchen, dies zu addieren :)

+0

Danke :). Ich habe das vermisst, aber leider ist der Tisch noch leer. – Fostenator

+0

Haben Sie die Delegierten (es gibt 2) für die Tabellenansicht einen Delegierten eingerichtet? – Manuel

+0

Vielleicht nicht ... Können Sie das bitte erklären? – Fostenator

0

Die Frage wurde tatsächlich auf die cellForRowAtIndexPath Methode verwendet. Beim Versuch, die Zellen zu füllen, verwendete ich einen einfachen NSString für ein NSMutableArray-Objekt, das nicht erlaubt ist. Modifizierter Code wie folgt:

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

cell.textLabel.text = cellValue;