我正在使用 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/