我已经在这个问题上工作了几个小时而且已经陷入困境了。我可能正在做一些多余或愚蠢的事情导致这个问题,所以我能得到的任何帮助都会非常感激。
我正在使用NSURL来引入一个网站:http://undignified.podbean.com/feed。从这里开始,我使用NSXMLParser来解析XML页面并搜索elementName“enclosure”。 “enclosure”元素包含一个属性“url”,其中包含Mp3的URL。解析部分工作,我能够NS注销数组的内容,我已经验证所有可用的URL都存在,但我无法将其加载到UITableView,它只是加载为空白。我正在加载解析出的属性值的数组,_podAllEntries将使用dispatch_async中的值记录到控制台,但是当我的ViewController的任何其他部分访问此数组时,它是空白的。我认为,因为在后台线程上调用了异步,可能需要实现某种委托,以便其他方法可以访问此数组中的值?我可能完全错了。
总结一下,我正在尝试连接到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 :(得分:0)
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
尝试添加:)
答案 1 :(得分:0)
该问题实际上与cellForRowAtIndexPath方法有关。当我尝试填充单元格时,我使用了一个纯NSString来对抗NSMutableArray对象,这是不允许的。修改了以下代码:
NSString *cellValue = [NSString stringWithFormat:@"%@", _podAllEntries];
cell.textLabel.text = cellValue;