2013-06-27 2 views
0

Мое приложение использует RSS-канал для заполнения ячеек в виде таблицы с заголовками статей из фида. Я пытаюсь добавить опубликованную дату для каждой статьи в соответствующую ячейку, но она не отображается. Заголовки отображаются только как textLabel, но дата не отображается в detailTextLabel. У меня есть NSLog, который показывает все элементы pubDate и NSLog в файле didSelectRowAtIndexPath, который показывает pubDate для выбранной строки. Любая помощь?Показать RSS pubDate в таблице View Cell

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 

Table View Controller

#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

Вы используете UITableViewCellStyleDefault при построении своей камеры. Этот стиль не предоставляет detailTextLabel. Вероятно, вы должны принять UITableViewCellStyleSubtitle.

+0

Я знал это. лол. Я использую его в других табличных представлениях, но, думаю, я просто забыл изменить его здесь. Благодаря! – raginggoat

+0

Любая идея, как я могу вычеркнуть отметку времени на pubDate? – raginggoat

+0

Прямо сейчас наступает дата Wed, 05 Jun 2013 14:55:17 +0000, но мне хотелось бы просто показать Wed, 05 Jun 2013 – raginggoat