在Table View Cell中显示RSS pubDate

时间:2013-06-27 12:54:19

标签: ios uitableview rss

我的应用使用RSS Feed来填充表格视图中的单元格,其中包含来自Feed的文章标题。我正在尝试将每篇文章的发布日期添加到相应的单元格,但它没有显示出来。标题显示为textLabel,但日期未显示在detailTextLabel中。我有一个显示所有pubDate项目的NSLog和一个显示所选行的pubDate的didSelectRowAtIndexPath中的NSLog。有什么帮助吗?

RSSChannel.m

#import "RSSChannel.h"
#import "RSSItem.h"

@implementation RSSChannel
@synthesize items, title, infoString, parentParserDelegate, date;

- (id)init
{
    self = [super init];

    if (self)
    {
        // Create the container for the RSSItems this channel has
        items = [[NSMutableArray alloc]init];
    }

    return self;
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    NSLog(@"\t%@ found a %@ element", self, elementName);

    if ([elementName isEqual:@"title"])
    {
        currentString = [[NSMutableString alloc]init];
        [self setTitle:currentString];
    }
    else if ([elementName isEqual:@"pubDate"])
    {
        currentString = [[NSMutableString alloc]init];
        [self setDate:currentString];
    }
    else if ([elementName isEqual:@"description"])
    {
        currentString = [[NSMutableString alloc]init];
        [self setInfoString:currentString];
    }
    else if ([elementName isEqual:@"item"])
    {
        RSSItem *entry = [[RSSItem alloc]init];

        // Set up its parent as ourselves so we can regain control of the parser
        [entry setParentParserDelegate:self];

        // Turn the parser to the RSSItem
        [parser setDelegate:entry];

        [items addObject:entry];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)str
{
    [currentString appendString:str];
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    currentString = nil;

    if ([elementName isEqual:@"channel"])
    {
        [parser setDelegate:parentParserDelegate];
    }
}

@end

RSSItem.m

#import "RSSItem.h"

@implementation RSSItem

@synthesize title, link, date, isActionAlert, parentParserDelegate;

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    NSLog(@"\t\t%@ found a %@ element", self, elementName);
    if ([elementName isEqualToString:@"category"]) {
        NSLog(@"category");
    }
    if ([elementName isEqual:@"title"])
    {
        currentString = [[NSMutableString alloc]init];
        [self setTitle:currentString];
    }
    else if ([elementName isEqual:@"link"])
    {
        currentString = [[NSMutableString alloc]init];
        [self setLink:currentString];
    }
    else if ([elementName isEqual:@"pubDate"])
    {
        currentString = [[NSMutableString alloc]init];
        [self setDate:currentString];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)str
{
    if ([str isEqualToString:@"Action Alert"]) {
        isActionAlert = YES;
    }
    [currentString appendString:str];
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    currentString = nil;

    if ([elementName isEqual:@"item"])
    {
        [parser setDelegate:parentParserDelegate];
    }
}

@end

表视图控制器

#import "AgStoriesViewController.h"
#import "RSSChannel.h"
#import "RSSItem.h"
#import "WebViewController.h"
// #import "CustomCellBackground.h"
#import "DTCustomColoredAccessory.h"

@implementation AgStoriesViewController
{
    UIActivityIndicatorView *loadingIndicator;
}
@synthesize webViewController;

- (void)viewDidLoad
{
    UIImageView *background = [[UIImageView alloc]init];
    background.image = [UIImage imageNamed:@"plain_app-background.png"];

    CGFloat width = CGRectGetWidth(self.view.bounds);
    CGFloat height = CGRectGetHeight(self.view.bounds);

    self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
    [self.tableView setBackgroundView:background];
    self.title = @"Ag News";
    loadingIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    loadingIndicator.center = CGPointMake(width/2, height/2);
    loadingIndicator.hidesWhenStopped = YES;
    [self.view addSubview:loadingIndicator];
    [loadingIndicator startAnimating];
    // UIRefreshControl *refresh = [[UIRefreshControl alloc] init];
    // refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"];
    // [refresh addTarget:self action:@selector(refreshView:)forControlEvents:UIControlEventValueChanged];
    // self.refreshControl = refresh;
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    NSLog(@"%@ found a %@ element", self, elementName);
    if ([elementName isEqual:@"channel"])
    {
        // If the parser saw a channel, create new instance, store in our ivar
        channel = [[RSSChannel alloc]init];

        // Give the channel object a pointer back to ourselves for later
        [channel setParentParserDelegate:self];

        // Set the parser's delegate to the channel object
        [parser setDelegate:channel];
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // return 0;
    NSLog(@"channel items %d", [[channel items]count]);
    return [[channel items]count];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 50;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // return nil;
    UIImageView *image = [[UIImageView alloc]init];
    image.image = [UIImage imageNamed:@"CellImage.png"];

    UIImageView *background = [[UIImageView alloc]init];
    background.image = [UIImage imageNamed:@"plain_app-background.png"];

    UIImageView *highlightedCellImage = [[UIImageView alloc]init];
    highlightedCellImage.image = [UIImage imageNamed:@"HighlightedCellImage"];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"];
        cell.textLabel.font=[UIFont systemFontOfSize:16.0];
    }
    RSSItem *item = [[channel items]objectAtIndex:[indexPath row]];
    [[cell textLabel]setText:[item title]];
    [[cell detailTextLabel]setText:[item date]];

    NSLog(@"Date: %@", [item date]);

    tableView.backgroundColor = [UIColor clearColor];
    // cell.backgroundView = [[CustomCellBackground alloc] init];
    // cell.selectedBackgroundView = [[CustomCellBackground alloc] init];
    cell.textLabel.backgroundColor = [UIColor clearColor];
    cell.textLabel.highlightedTextColor = [UIColor blueColor];
    cell.textLabel.font = [UIFont fontWithName:@"FranklinGothicStd-ExtraCond" size:20.0];
    cell.textLabel.textColor = [UIColor whiteColor];
    cell.detailTextLabel.backgroundColor = [UIColor clearColor];
    cell.detailTextLabel.highlightedTextColor = [UIColor blueColor];
    cell.detailTextLabel.font = [UIFont fontWithName:@"FranklinGothicStd-ExtraCond" size:16.0];
    cell.detailTextLabel.textColor = [UIColor whiteColor];
    cell.backgroundView = image;
    cell.selectedBackgroundView = highlightedCellImage;
    tableView.backgroundView = background;

    DTCustomColoredAccessory *accessory = [DTCustomColoredAccessory accessoryWithColor:cell.textLabel.textColor];
    accessory.highlightedColor = [UIColor blueColor];
    cell.accessoryView =accessory;

    return cell;
}

- (void)fetchEntries
{
    // Create a new data container for the stuff that comes back from the service
    xmlData = [[NSMutableData alloc]init];

    // Construct a URL that will ask the service for what you want -
    // note we can concatenate literal strings together on multiple lines in this way - this results in a single NSString instance
    NSURL *url = [NSURL URLWithString:@"http://kyfbnewsroom.com/category/ag-news/feed"];

    // Put that URL into an NSURLRequest
    NSURLRequest *req = [NSURLRequest requestWithURL:url];

    // Create a connection that will exchange this request for data from the URL
    connection = [[NSURLConnection alloc]initWithRequest:req delegate:self startImmediately:YES];
}

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];

    if (self)
    {
        [self fetchEntries];
    }

    return self;
}

// This method will be called several times as the data arrives
- (void)connection:(NSURLConnection *)conn didReceiveData:(NSData *)data
{
    // Add the incoming chunk of data to the container we are keeping
    // The data always comes in the correct order
    [xmlData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)conn
{
    /* We are just checking to make sure we are getting the XML
     NSString *xmlCheck = [[NSString alloc]initWithData:xmlData encoding:NSUTF8StringEncoding];
     NSLog(@"xmlCheck = %@", xmlCheck);*/

    [loadingIndicator stopAnimating];

    // Create the parser object with the data received from the web service
    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:xmlData];

    // Give it a delegate
    [parser setDelegate:self];

    //Tell it to start parsing - the document will be parsed and the delegate of NSXMLParser will get all of its delegate messages sent to it before this line finishes execution - it is blocking
    [parser parse];

    // Get rid of the XML data as we no longer need it
    xmlData = nil;

    // Reload the table.. for now, the table will be empty
    [[self tableView]reloadData];

    NSLog(@"%@\n %@\n %@\n", channel, [channel title], [channel infoString]);
}

- (void)connection:(NSURLConnection *)conn didFailWithError:(NSError *)error
{
    // Release the connection object, we're done with it
    connection = nil;

    // Release the xmlData object, we're done with it
    xmlData = nil;

    // Grab the description of the error object passed to us
    NSString *errorString = [NSString stringWithFormat:@"Fetch failed: %@", [error localizedDescription]];

    // Create and show an alert view with this error displayed
    UIAlertView *av = [[UIAlertView alloc]initWithTitle:@"Error" message:errorString delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [av show];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Push the web view controller onto the navigation stack - this implicitly creates the web view controller's view the first time through
    // [[self navigationController]pushViewController:webViewController animated:YES];
    [self.navigationController pushViewController:webViewController animated:NO];

    // Grab the selected item
    RSSItem *entry = [[channel items]objectAtIndex:[indexPath row]];

    NSLog(@"Channel Items: %@", [[channel items]objectAtIndex:[indexPath row]]);

    // Construct a URL with the link string of the item
    NSURL *url = [NSURL URLWithString:[entry link]];

    NSLog(@"Link: %@", [entry link]);

    // Construct a request object with that URL
    NSURLRequest *req = [NSURLRequest requestWithURL:url];

    NSLog(@"URL: %@", url);

    // Load the request into the web view
    [[webViewController webView]loadRequest:req];
    webViewController.hackyURL = url;
    NSLog(@"Request: %@", req);

    // Set the title of the web view controller's navigation item
    // [[webViewController navigationItem]setTitle:[entry title]];

    NSLog(@"Title: %@", [entry title]);

    NSLog(@"Pub Date: %@", [entry date]);
}

@end

1 个答案:

答案 0 :(得分:1)

您在构建单元格时使用UITableViewCellStyleDefault。此样式不提供detailTextLabel。你应该采取UITableViewCellStyleSubtitle