0

我遇到的问题是我有一个标记为:_podAllEntries 的 NSMutableArray,其中包含 url 路径。然后将该数组的内容加载到我的 UITableView 中的一行中。此数组中共有 4 个项目,每个项目在表中应该有一个条目。以下是该应用程序如何工作的更详细说明:

这个 iOS 应用程序使用 NSURL 来使用来自网站的 XML 数据:http: //undignified.podbean.com/feed。从那里我使用 NSXMLParser 解析 XML 并在“enclosure”元素中搜索一个名为“url”的属性。然后将匹配“url”的所有属性添加到一个数组中,然后应该将每个项目加载到 UITableView 中,每个项目位于单独的行中(如前所述,只有一行填充)。

在这一点上,我可能遗漏了一些小东西,如果能向正确的方向轻推或提供任何反馈,将不胜感激。

UnDigParser.h

解析类的头文件:

#import <Foundation/Foundation.h>

@interface UnDigParser : NSXMLParser <NSXMLParserDelegate> {

}
@property (retain) NSMutableArray *links;
@end

UnDigParser.m

解析类的实现:

#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];
        }
    }
    //NSLog(@"%@",_links);
}

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

@end

视图控制器.h

@class WebViewController;

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

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

@end

视图控制器.m

@implementation getpodViewController

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

-(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 insertObject:parser.links atIndex:0];
    NSLog(@"%@", _podAllEntries);

    [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]]
                          withRowAnimation:UITableViewRowAnimationRight];
}

- (void)viewDidLoad 
{
    [super viewDidLoad];

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

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

- (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 = [NSString stringWithFormat:@"%@", _podAllEntries];

    cell.textLabel.text = cellValue;
    return cell;
}
4

3 回答 3

0

您不了解如何在 iOS 中构建 UITableView。您应该在整个UITableViewDataSource协议中填充您的 UITableView。

您应该阅读有关UITableView的 Apple 信息。

不要insertRowsAtIndexPaths用于添加“主”行。

于 2012-04-12T18:08:42.207 回答
0

你需要这样做:

 [NSString stringWithFormat:@"%@", [_podAllEntries objectAtIndex:indexPath.row]];

例子:

-(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 = [NSString stringWithFormat:@"%@", [_podAllEntries objectAtIndex:indexPath.row]];

    cell.textLabel.text = cellValue;

    /* to use less code, you can also do it like this: */
    //cell.textLabel.text = [_podAllEntries objectAtIndex:indexPath.row];

    return cell;
}

您还可以从addRows因为cellForRowAtIndexPath:是实际创建单元格的位置删除以下语句。

[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationRight];
于 2012-04-12T18:18:02.593 回答
0
  1. 在 cellForRowAtIndexPath 中,而不是[NSString stringWithFormat:@"%@", _podAllEntries];你应该有[NSString stringWithFormat:@"%@", [_podAllEntries objectAtIndex:indexPath.row]];. 这将确保表的每一行都有不同的 _podAllEntries 数组行。

  2. 乔纳斯是对的,你不应该这样做insertRowsAtIndexPaths。您定义的委托方法负责确保添加所有内容。

  3. 你 _podAllEntries 有多少个项目?它看起来像:[_podAllEntries insertObject:parser.links atIndex:0];将添加一个对象,该对象本身就是一个数组。因此,您只有一排。我想你想要[_podAllEntries insertObjectsFromArray:parser.links]

于 2012-04-12T18:26:31.823 回答