objective-c - UILabel 在 UITableViewCell 中变为 nil

标签 objective-c ios uitableview uilabel

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

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

提前致谢。

Xcode开发

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

最佳答案

在您的代码中,只有当 indexPath.section == 1 时,您才将 TTTAtributedLabel 添加到单元格;但是,您只使用一个标识符“cellID”来使可重用单元格出列。因此,当您调用时:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];

不保证单元格始终具有 TTTAtributedLabel。您需要根据 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];
}

希望这对您有所帮助!

关于objective-c - UILabel 在 UITableViewCell 中变为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8589558/

相关文章:

objective-c - 通过 API 检索签名身份列表

iphone - 在 Web 服务之前加载 UITableViewController

ios - 如何在使用默认单元格值加载一次 View 后更新 UITableView 单元格(cell.detailTextLabel.text)的值

iOS:从委托(delegate)中获取实例变量值(属性)

objective-c - 了解使用 != 返回 BOOL 的方法

ios - Swift - tableviewcell 中按钮的动态数量

ios - Objective-C:执行完方法后获得单例类方法的结果吗?

ios - loadNibNamed 从 Storyboard

objective-c - 堆栈 - 框架 - Objective-C 中的堆

iOS - 无法获取 @IBDesignable .xib 文件以显示在 Storyboard或模拟器上