uitableview reloaddata 缓存?
Posted
技术标签:
【中文标题】uitableview reloaddata 缓存?【英文标题】:uitableview reloaddata cache? 【发布时间】:2012-01-22 16:02:34 【问题描述】:我在使用 UITableView 和方法 reloadData 时遇到了一些问题。
单击刷新按钮时,我正在刷新 tableView,数据库中的最后一个信息按降序排列,因此最近的项目应该出现在第一个位置。
我的 tableview 中的每个单元格都被自定义标签和 uiimageviews 填充。
嗯...问题是,当我按下刷新按钮并找到新数据时,前 5 行(即显示在显示屏中的行)没有更新,但后面的行会更新。但是,如果我按下前 5 行中的任何一行,它们就会正确调用 tableView:didSelectRowAtIndexPath: 方法并使用新数据。
所以,问题在于 tableview 的前 5 行的“视觉”内容没有被更新。
有人可以帮我吗?
谢谢!
代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
NSString *CellIdentifier = [ NSString stringWithFormat: @"%d:%d", [ indexPath indexAtPosition: 0 ], [ indexPath indexAtPosition:1 ]];
UITableViewCell *cell = [ tableView dequeueReusableCellWithIdentifier: CellIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc] initWithFrame: CGRectZero reuseIdentifier: CellIdentifier] autorelease];
// Configure the cell...
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
Activity *activity = [[self.activities valueForKey:[[[self.activities allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];
cell.textLabel.text=@"";
//Mostramos el nombre
UILabel *label= [[UILabel alloc] initWithFrame:CGRectMake(60, -5, 200, 34)];
label.text = [activity name];
label.font = [UIFont boldSystemFontOfSize:17];
label.backgroundColor = [UIColor clearColor];
[cell addSubview:label];
[label release];
//Mostramos la imagen
UIImageView *leftImage = [[UIImageView alloc] initWithFrame:CGRectMake(5, 3, 50, 50)];
[cell addSubview:leftImage];
UITextView *textView=[[UITextView alloc] initWithFrame:CGRectMake(60, 25, 200, 38)];
textView.editable = NO;
textView.backgroundColor = [UIColor clearColor];
textView.textColor = [UIColor grayColor];
textView.font = [UIFont systemFontOfSize:12.0];
textView.contentInset = UIEdgeInsetsMake(-8,-8,0,0);
textView.userInteractionEnabled=NO;
[cell addSubview:textView];
switch ([activity notType])
case 0:
textView.text = [NSString stringWithFormat:NSLocalizedString(@"requestPUSH",@""),[activity name]];
leftImage.image = [UIImage imageNamed:@"ios.png"];
break;
case 1:
textView.text = [NSString stringWithFormat:NSLocalizedString(@"MPCreatedPushString",@""),[activity name],[activity nameItem]];
leftImage.image = [UIImage imageNamed:@"mpNew.png"];
break;
case 2:
textView.text = [NSString stringWithFormat:NSLocalizedString(@"MPUpdatedPushString",@""),[activity name],[activity nameItem]];
leftImage.image = [UIImage imageNamed:@"mpUpdated.png"];
break;
case 3:
textView.text = [NSString stringWithFormat:NSLocalizedString(@"MPDeletedPushString",@""),[activity name],[activity nameItem]];
leftImage.image = [UIImage imageNamed:@"ios.png"];
break;
case 4:
textView.text = [NSString stringWithFormat:NSLocalizedString(@"MPGuestConfirmationPUSHString",@""),[activity name],[activity nameItem]];
leftImage.image = [UIImage imageNamed:@"attend.png"];
break;
case 5:
if ([[activity message] isEqualToString:@"noData"])
textView.text = [NSString stringWithFormat:NSLocalizedString(@"ShoutPushString",@""),[activity name]];
else
textView.text = [NSString stringWithFormat:NSLocalizedString(@"ShoutPushStringWithData",@""),[activity name], [activity message]];
UIImage *contactImage = [UIImage imageWithData:[[activity person] pic]];
if (contactImage!=nil)
leftImage.image = contactImage;
//redondeamos bordes
CALayer * l = [leftImage layer];
[l setMasksToBounds:YES];
[l setCornerRadius:5.0];
else
leftImage.image = [UIImage imageNamed:@"ios.png"];
break;
case 6:
textView.text = [NSString stringWithFormat:NSLocalizedString(@"CheckinPushString",@""),[activity name],[activity nameItem]];
leftImage.image = [UIImage imageNamed:@"ios.png"];
break;
case 7:
textView.text = [NSString stringWithFormat:NSLocalizedString(@"MPGuestRejectionPUSHString",@""),[activity name],[activity nameItem]];
leftImage.image = [UIImage imageNamed:@"reject.png"];
break;
default:
break;
[leftImage release];
[textView release];
//Mostrar fecha
double timestamp = [[activity datetime] doubleValue]/1000;
NSString *dateShow;
NSDate *datetime = [NSDate dateWithTimeIntervalSince1970:timestamp];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"HH:mm"];
dateShow=[dateFormat stringFromDate:datetime];
UILabel *label2= [[UILabel alloc] initWithFrame:CGRectMake(240, 0, 70, 20)];
label2.text = dateShow;
label2.textAlignment = UITextAlignmentRight;
label2.font = [UIFont systemFontOfSize:12];
label2.backgroundColor = [UIColor clearColor];
label2.textColor = [UIColor blueColor];
[cell addSubview:label2];
[label2 release];
return cell;
【问题讨论】:
也许您应该发布您的单元格创建代码? 代码加了,不少,呵呵!谢谢 【参考方案1】:嗯,所以你给每个单元格一个唯一的单元格标识符。你有这样做的理由吗? 大多数人都试图通过这种方式来修补他们对 iOS 表格视图的误解......
当您重新加载表格时,此调用 UITableViewCell *cell = [ tableView dequeueReusableCellWithIdentifier: CellIdentifier];
将为您提供一个可重复使用的单元格(读取已包含内容)。
但是您的代码仅适用于“新鲜”单元格:if (cell == nil)
,您只是没有为这种情况做好准备......
【讨论】:
哇!不知道,我不必重复使用这些单元格。这解决了我的问题!非常感谢!以上是关于uitableview reloaddata 缓存?的主要内容,如果未能解决你的问题,请参考以下文章
UITableView.reloadData() 没有刷新 tableView。没有错误信息
UITableView 的 reloadData() 的替代方案?
UIView 与 UITableview 和 UIImageview,使用 reloadData 访问 UITableview