Reputation: 24481
I am using TTTAttributedLabel to replace my UITableViewCell's textLabel in the tableView section 1. However, the TTTAttributedLabel is returning nil upon scroll causing the text of the label to change to the text of the first cell in section 1.
Please can you tell me how I can prevent this from happening?
Thanks in advanced.
XcodeDev
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellID = @"cellID";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID] autorelease];
if (indexPath.section == 1) {
if ([cell viewWithTag:05] == nil) {
TTTAttributedLabel *label = [[[TTTAttributedLabel alloc] initWithFrame:CGRectMake(15, 5, 270, 30)] autorelease];
[label setTag:05];
[label setTextColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:0.75]];
[label setBackgroundColor:[UIColor clearColor]];
[cell addSubview:label];
}
}
}
if (indexPath.section == 0) {
NSArray *array = [NSArray arrayWithObjects:@"Likes", @"Posts", @"Comments", nil];
[cell.textLabel setText:[array objectAtIndex:indexPath.row]];
[cell setBackgroundColor:[UIColor whiteColor]];
[cell.textLabel setTextColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:0.75]];
[cell.textLabel setFont:[UIFont boldSystemFontOfSize:cell.textLabel.font.pointSize]];
}
else if (indexPath.section == 1) {
TBNotification *notif = [notifications objectAtIndex:indexPath.row];
if ([notif.behavior isEqualToString:@"like"]) {
NSMutableString *str = [NSMutableString string];
[str appendString:[[notif actor] stringByAppendingFormat:@" liked your post %@", notif.postTitle]];
TTTAttributedLabel *label = (TTTAttributedLabel *) [cell viewWithTag:05];
[label setText:str afterInheritingLabelAttributesAndConfiguringWithBlock:^NSMutableAttributedString *(NSMutableAttributedString *mutableAttributedString) {
NSRange stringRange = NSMakeRange(0, [mutableAttributedString length]);
NSRegularExpression *regexp = NameRegularExpression();
NSRange nameRange = [regexp rangeOfFirstMatchInString:[mutableAttributedString string] options:0 range:stringRange];
UIFont *boldSystemFont = [UIFont boldSystemFontOfSize:16];
CTFontRef boldFont = CTFontCreateWithName((CFStringRef)boldSystemFont.fontName, boldSystemFont.pointSize, NULL);
if (boldFont) {
[mutableAttributedString addAttribute:(NSString *)kCTFontAttributeName value:(id)boldFont range:nameRange];
CFRelease(boldFont);
}
[mutableAttributedString replaceCharactersInRange:nameRange withString:[[mutableAttributedString string] substringWithRange:nameRange]];
stringRange = [[mutableAttributedString string] rangeOfString:notif.postTitle];
boldSystemFont = [UIFont boldSystemFontOfSize:16];
boldFont = CTFontCreateWithName((CFStringRef)boldSystemFont.fontName, boldSystemFont.pointSize, NULL);
if (boldFont) {
[mutableAttributedString addAttribute:(NSString *)kCTFontAttributeName value:(id)boldFont range:stringRange];
CFRelease(boldFont);
}
[mutableAttributedString replaceCharactersInRange:stringRange withString:[[mutableAttributedString string] substringWithRange:stringRange]];
return mutableAttributedString;
}];
}
else if ([notif.behavior isEqualToString:@"new_follow"]) {
NSMutableString *str = [NSMutableString string];
[str appendString:[[notif actor] stringByAppendingString:@" is now following you."]];
TTTAttributedLabel *label = (TTTAttributedLabel *) [cell viewWithTag:05];
[label setText:str afterInheritingLabelAttributesAndConfiguringWithBlock:^NSMutableAttributedString *(NSMutableAttributedString *mutableAttributedString) {
NSRange stringRange = NSMakeRange(0, [mutableAttributedString length]);
NSRegularExpression *regexp = NameRegularExpression();
NSRange nameRange = [regexp rangeOfFirstMatchInString:[mutableAttributedString string] options:0 range:stringRange];
UIFont *boldSystemFont = [UIFont boldSystemFontOfSize:16];
CTFontRef boldFont = CTFontCreateWithName((CFStringRef)boldSystemFont.fontName, boldSystemFont.pointSize, NULL);
if (boldFont) {
[mutableAttributedString addAttribute:(NSString *)kCTFontAttributeName value:(id)boldFont range:nameRange];
CFRelease(boldFont);
}
[mutableAttributedString replaceCharactersInRange:nameRange withString:[[mutableAttributedString string] substringWithRange:nameRange]];
return mutableAttributedString;
}];
}
else if ([[notif behavior] isEqualToString:@"new_comment"]) {
NSMutableString *str = [NSMutableString string];
[str appendString:[[notif actor] stringByAppendingFormat:@" commented on your post %@", notif.postTitle]];
TTTAttributedLabel *label = (TTTAttributedLabel *) [cell viewWithTag:05];
[label setText:str afterInheritingLabelAttributesAndConfiguringWithBlock:^NSMutableAttributedString *(NSMutableAttributedString *mutableAttributedString) {
NSRange stringRange = NSMakeRange(0, [mutableAttributedString length]);
NSRegularExpression *regexp = NameRegularExpression();
NSRange nameRange = [regexp rangeOfFirstMatchInString:[mutableAttributedString string] options:0 range:stringRange];
UIFont *boldSystemFont = [UIFont boldSystemFontOfSize:16];
CTFontRef boldFont = CTFontCreateWithName((CFStringRef)boldSystemFont.fontName, boldSystemFont.pointSize, NULL);
if (boldFont) {
[mutableAttributedString addAttribute:(NSString *)kCTFontAttributeName value:(id)boldFont range:nameRange];
CFRelease(boldFont);
}
[mutableAttributedString replaceCharactersInRange:nameRange withString:[[mutableAttributedString string] substringWithRange:nameRange]];
stringRange = [[mutableAttributedString string] rangeOfString:notif.postTitle];
boldSystemFont = [UIFont boldSystemFontOfSize:16];
boldFont = CTFontCreateWithName((CFStringRef)boldSystemFont.fontName, boldSystemFont.pointSize, NULL);
if (boldFont) {
[mutableAttributedString addAttribute:(NSString *)kCTFontAttributeName value:(id)boldFont range:stringRange];
CFRelease(boldFont);
}
[mutableAttributedString replaceCharactersInRange:stringRange withString:[[mutableAttributedString string] substringWithRange:stringRange]];
return mutableAttributedString;
}];
}
}
[cell setAccessoryView:[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"chevron"]] autorelease]];
return cell;
}
Upvotes: 0
Views: 1489
Reputation: 3638
In your code, you are adding TTTAttributedLabel
to the cell only when indexPath.section == 1
; however, you are using only one identifier 'cellID' to dequeue reusable cell. Thus, when you call:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
it is not guaranteed that the cell has always TTTAttributedLabel
. You need to change cellID according to whether or not indexPath.section == 1
. For instance, this probably resolves the issue:
static NSString *cellID = @"cellID";
static NSString *cellIDWithLabel = @"cellID_label";
UITableViewCell *cell;
if(indexPath.section != 1) {
cell = [tableView dequeueReusableCellWithIdentifier:cellID];
}
else {
cell = [tableView dequeueReusableCellWithIdentifier:cellIDWithLabel];
}
Hope this helps!
Upvotes: 2