2011-12-21 80 views
0

我正在使用TTTAttributedLabel替换tableView部分中的我的UITableViewCell的textLabel。但是,TTTAttributedLabel在滚动时返回nil,导致标签的文本更改为第1节中的第一个单元格的文本。UILabel在UITableViewCell中变为零

请你能告诉我如何防止这种情况发生?

谢谢先进。

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; 
} 

回答

2

在代码中,要添加TTTAttributedLabel到小区只有当indexPath.section == 1;但是,您仅使用一个标识符'cellID'来使可重用单元出列。因此,当您致电:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID]; 

不保证该单元总是有TTTAttributedLabel。您需要根据是否indexPath.section == 1更改cellID。例如,这可能会解决问题:

static NSString *cellID = @"cellID"; 
static NSString *cellIDWithLabel = @"cellID_label"; 
UITableViewCell *cell; 

if(indexPath.section != 1) { 
    cell = [tableView dequeueReusableCellWithIdentifier:cellID]; 
} 
else { 
    cell = [tableView dequeueReusableCellWithIdentifier:cellIDWithLabel]; 
} 

希望这有助于!