UITableViewController:Data Parses但`numberOfRowsInSection:`返回NULL。

时间:2011-06-30 22:24:26

标签: ios4 uitableview nsxmlparser

我有一个UITableView,由从xml解析的数据填充。解析有效但表格仍为空白。

控制台显示解析了url的xml格式并显示其组件。它还显示了tableview行在不同函数中询问但numberOfRowsInSection:返回Null时应该具有的对象数。因此,模拟器中的tableView保持空白。

这是我的代码。这是教程中的简单代码:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#import < UIKit/UIKit.h >

@interface RootViewController : UITableViewController < NSXMLParserDelegate >{

    IBOutlet UITableView *newsTable;
    UIActivityIndicatorView *activityIndicator;
    CGSize cellSize;
    NSXMLParser *rssParser;
    NSMutableArray *stories;
    NSMutableDictionary *item;
    NSString *currentElement;
    NSMutableString *currentTitle, *currentDate, *currentSummary, *currentLink; 
}

@property (nonatomic, retain) NSMutableArray *stories;

@property (nonatomic, retain) IBOutlet UITableView *newsTable;

-(void)parseXMLFileAtURL:(NSString *)URL;

@end


+++++++++++++++++++++++++++ RootViewController.m ++++++++++++++++++++++++++++++++++++++

#import "RootViewController.h"


@implementation RootViewController
@synthesize newsTable, stories;


-(void)viewDidLoad {

    [super viewDidLoad];

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.

    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}


-(void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    [newsTable reloadData];
}


-(void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];

    if([stories count] == 0){
        NSString *path = @"http://feeds.feedburner.com/TheAppleBlog";

        [self parseXMLFileAtURL:path];      
    }

    cellSize = CGSizeMake([newsTable bounds].size.width, 60);

}

// Customize the number of sections in the table view.

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return 1;
}


-(void)parseXMLFileAtURL:(NSString *)URL {

    stories = [[NSMutableArray alloc] init];

    NSURL *xmlURL = [NSURL URLWithString:URL];

    rssParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];

    [rssParser setDelegate:self];

    [rssParser setShouldProcessNamespaces:NO];

    [rssParser setShouldReportNamespacePrefixes:NO];

        [rssParser setShouldResolveExternalEntities:NO];

    [rssParser parse];
}

-(void)parserDidStartDocument:(NSXMLParser *)parser{

    NSLog(@"Found file and started parsing");
}

-(void) parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{

    NSString *errorString = [NSString stringWithFormat:@"Unable to download story feed from the website (error code %i)", [parseError code]];

    NSLog(@"error parsing XML: %@", errorString);

    UIAlertView *errorAlert = [[UIAlertView alloc]:@"Error loading content" message:errorString delegate:self cancelButtonTitle:@"OK" otherButtonTitle:nil];

    [errorAlert show];
}

-(void)parser:(NSXMLParser *)parser  didStartElement:(NSString *)elementName  namespaceURI:(NSString *)namespaceURI  qualifiedName:(NSString *)qName  attributes:(NSDictionary *)attributeDict{

    NSLog(@"Found this Element %@", elementName);
    currentElement = [elementName copy];


    if ([elementName isEqualToString:@"item"]) {

        item = [[NSMutableDictionary alloc] init];

        currentTitle = [[NSMutableString alloc] init];
        currentDate = [[NSMutableString alloc] init];
        currentSummary = [[NSMutableString alloc] init];
        currentLink = [[NSMutableString alloc] init];               
    }
}

-(void)parser:(NSXMLParser *)parser  didEndElement:(NSString *)elementName  namespaceURI:(NSString *)namespaceURI  qualifiedName:(NSString *)qName {

    NSLog(@"End this Element %@", elementName);

    if ([elementName isEqualToString:@"item"]) {

        [item setObject:currentTitle forKey:@"title"];
        [item setObject:currentLink forKey:@"link"];
        [item setObject:currentSummary forKey:@"summary"];
        [item setObject:currentDate forKey:@"date"];

        [stories addObject:[item copy]];
        NSLog(@"adding Story : %@",currentTitle);
    }

}

// Customize the number of rows in the table view.

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    NSLog(@"Count  is = %@", [stories count]);

    return [stories count];
}


-(void)parser:(NSXMLParser *)parser  foundCharacters:(NSString *)string{

    NSLog(@"Found characters: %@", string);

    if([currentElement isEqualToString:@"title"]){

        [currentTitle appendString:string];
        NSLog(@"The Title is : %@", currentTitle);
    }   
    else if([currentElement isEqualToString:@"link"]){
        [currentLink appendString:string];
        NSLog(@"The Link is : %@", currentLink);
    }
    else if([currentElement isEqualToString:@"description"]){
        [currentSummary appendString:string];
        NSLog(@"The summary is : %@", currentSummary);
    }
    else if([currentElement isEqualToString:@"pubDate"]){
        [currentDate appendString:string];
        NSLog(@"The Date is : %@", currentDate);
    }

}

-(void)parserDidEndDocument:(NSXMLParser *)parser{

    [activityIndicator stopAnimating];

    [activityIndicator removeFromSuperview];

    NSLog(@"Stories array has %d items", [stories count]);

    NSLog(@"Stories are : %@",stories);
}


// Customize the appearance of table view cells.

-(UITableViewCell *)tableView:(UITableView *)tableView  cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *MyIdentifier = @"MyIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
    }

    // Configure the cell.

    cell.textLabel.text = (NSString *)[[stories objectAtIndex:indexPath.row] objectForKey:@"title"];

    return cell;
}

-(void)dealloc {

     [super dealloc];

    [newsTable release];
    [currentDate release];
    [currentElement release];
    [currentSummary release];
    [currentLink release];
    [stories release];
    [item release];
    [currentTitle release];
    [rssParser release];
}

3 个答案:

答案 0 :(得分:2)

您必须在解析XML之后通过调用reloadData 告诉表视图有新数据。

答案 1 :(得分:0)

newsTable插座是否正确连接到IB中的表格视图?并且,表格的dataSource插座是否设置为您的视图控制器?

答案 2 :(得分:0)