I have made major changes and setup a custom class for the TableView Cell.
Cell.h
#import <UIKit/UIKit.h>
@interface Cell : UITableViewCell
@property (nonatomic, retain) UILabel *month;
@property (nonatomic, retain) UILabel *date;
@end
Cell.m
#import "Cell.h"
@implementation Cell
@synthesize date, month;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
}
return self;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
- (void)layoutSubviews {
[super layoutSubviews];
self.imageView.frame = CGRectMake(1,1,69,69);
float limgW = self.imageView.image.size.width;
if(limgW > 0) {
UIFont *cellFont3 = [UIFont fontWithName:@"ArialRoundedMTBold" size:9];
UIFont *cellFont4 = [UIFont fontWithName:@"ArialRoundedMTBold" size:18];
self.textLabel.frame = CGRectMake(82,0,228,53);
self.detailTextLabel.frame = CGRectMake(82, 20, 228, 53);
self.month = [[UILabel alloc] initWithFrame:CGRectMake(8, 10, 53, 21)];
self.month.font = cellFont3;
self.month.textAlignment = UITextAlignmentCenter;
self.month.backgroundColor = [UIColor clearColor];
self.date = [[UILabel alloc] initWithFrame:CGRectMake(11, 21, 50, 45)];
self.date.backgroundColor = [UIColor clearColor];
self.date.font = cellFont4;
self.date.textAlignment = UITextAlignmentCenter;
}
}
@end
Then in my TableView code:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
Cell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[Cell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
RSSEntry *entry = [_allEntries objectAtIndex:indexPath.row];
NSDateFormatter * dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
[dateFormatter setDateStyle:NSDateFormatterShortStyle];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MM"];
NSString *monthfromdate = [formatter stringFromDate:entry.articleDate];
NSLog(@"%@", monthfromdate);
[formatter release];
NSDateFormatter *formatter2 = [[NSDateFormatter alloc] init];
[formatter2 setDateFormat:@"dd"];
NSString *datefromdate = [formatter2 stringFromDate:entry.articleDate];
NSLog(@"%@", datefromdate);
[formatter2 release];
if ([monthfromdate isEqualToString:@"01"]) {
self.currentmonth = @"January";
}
if ([monthfromdate isEqualToString:@"02"]) {
self.currentmonth = @"February";
}
if ([monthfromdate isEqualToString:@"03"]) {
self.currentmonth = @"March";
}
if ([monthfromdate isEqualToString:@"04"]) {
self.currentmonth = @"April";
}
if ([monthfromdate isEqualToString:@"05"]) {
self.currentmonth = @"May";
}
if ([monthfromdate isEqualToString:@"06"]) {
self.currentmonth = @"June";
}
if ([monthfromdate isEqualToString:@"07"]) {
self.currentmonth = @"July";
}
if ([monthfromdate isEqualToString:@"08"]) {
self.currentmonth = @"August";
}
if ([monthfromdate isEqualToString:@"09"]) {
self.currentmonth = @"September";
}
if ([monthfromdate isEqualToString:@"10"]) {
self.currentmonth = @"October";
}
if ([monthfromdate isEqualToString:@"11"]) {
self.currentmonth = @"November";
}
if ([monthfromdate isEqualToString:@"12"]) {
self.currentmonth = @"December";
}
NSString *currentday = datefromdate;
NSString *articleDateString = [dateFormatter stringFromDate:entry.articleDate];
UIFont *cellFont = [UIFont fontWithName:@"ArialRoundedMTBold" size:15];
UIFont *cellFont2 = [UIFont fontWithName:@"ArialRoundedMTBold" size:12];
cell.imageView.image = [UIImage imageNamed:@"calendar1.png"];
cell.imageView.contentMode = UIViewContentModeScaleAspectFit;
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ - %@", articleDateString, entry.blogTitle];
cell.detailTextLabel.textColor = [UIColor grayColor];
cell.detailTextLabel.font = cellFont2;
cell.textLabel.text = entry.articleTitle;
cell.textLabel.font = cellFont;
cell.month.text = currentmonth;
cell.date.text = currentday;
return cell;
}
This solves problems with repeats, or labels being written on top of each other, but only the cell.textLabel shows anything. Nothing appears on the detailTextLabel or the other 2 labels I set up.
Your approach is incorrect. When cells are being reused, it does not necessarily means that the cell on index path {0,1} will be reused the next time that this particular index path cell becomes visible. A cell of the same identifier will be used, and it might contain the data of a different cell at a different index path. Your approach should be to dequeue or initialize the cell depending on the cell existence after dequeing, but always assign data on the cell based on the index path .
A few words of advice: do not create/release NSDateFormatter objects inside the cellForRowAtIndexPath method. It will give you performance issues. Also, for organization purposes, please subclass UITableViewCell and create the interface properly. Adding them on the fly is messy and confusing.
Also, looking at what you are trying to do, you might want to take a look at NSDateFormatter’s monthSymbols and weekdaySymbols method, and NSDateComponent documentation. You can get the months and day information instead of having 12 “ifs” to get the months.