自定义 Tableview 单元格的问题

Posted

技术标签:

【中文标题】自定义 Tableview 单元格的问题【英文标题】:Trouble with custom Tableview cell 【发布时间】:2011-09-21 11:12:29 【问题描述】:

我的应用由 3 个视图组成(视图 1 (Tableview1)、视图 2 (Tableview2)、视图 3 (DetailView))。

我在我的视图 2 (Tableview2) 中设置了一个带有子视图(imageViews 和标签)的自定义 tableview 单元格。

其中一个子视图是 ImageView,如果单元格 ID 在收藏夹数组中,则包含图像。当您选择一个 cellForRowAtIndexpath 时,您将被推送到一个新视图(视图 3 (DetailView)),您可以在其中按下一个按钮并使该项目成为收藏夹。 当您关闭该视图并返回时,会显示图像,一切正常。

当我尝试取消选择收藏项时出现问题。最喜欢的符号仍然显示在 tableView 中,直到我返回 View 1 (Tableview1)。

我尝试在 ViewWillAppear 的视图 2 中调用 [myTableview reloadData],但收藏夹符号仍然存在。我的收藏夹数组已保存并使用正确的值加载。

数组在 ViewWillAppear 处更新...

可能是什么问题?

相关代码:编辑 - 从 cellForRowAtIndexPath 发布所有相关代码:一切正常,但如果我从自定义单元格中删除图像,tableview 不会更新... 编辑:使用 for 循环中的 else 语句更新为尝试从不再在收藏夹数组中的项目中删除收藏的图像。 编辑 编辑 编辑:现在工作,在我的 for 循环中添加了一个 break 语句......更新了代码,以便它可以帮助其他人......

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

static NSString *CellIdentifier = @"Cell";
CustomCell *cell = (CustomCell *)[myTableView dequeueReusableCellWithIdentifier:CellIdentifier];




if (cell == nil) 
        cell = [[[CustomCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    

[cell setAccessoryType: UITableViewCellAccessoryDisclosureIndicator];

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

NSString *kategori = [prefs objectForKey:@"kategoriID"];

NSLog(@"KategoriID = %@", kategori);

rowArray = nil;

rowArray = [[NSMutableArray alloc] init];

for(int i=0; i < [listOfItems count]; i++) 

    if([kategori isEqualToString:[listOfItems objectAtIndex:i]])
    
        //Tilføjer ID
         [rowArray addObject:[NSNumber numberWithInt:i-5]];



    





int arrayValue = [[rowArray objectAtIndex:indexPath.row] intValue];

cell.primaryLabel.text = [listOfItems objectAtIndex:arrayValue+1];
cell.secondaryLabel.text = [listOfItems objectAtIndex:arrayValue+2];
cell.myImageView.image = [UIImage imageNamed:[listOfItems objectAtIndex:arrayValue+4]];


//Time
cell.timeImageView.image = [UIImage imageNamed:@"03-clock.png"];
cell.timeLabel.text = [listOfItems objectAtIndex:arrayValue+6];

//Views
cell.viewsImageView.image = [UIImage imageNamed:@"04-eye.png"];
cell.viewsLabel.text = [listOfItems objectAtIndex:arrayValue+7];


//Stars
NSString *starsString = [listOfItems objectAtIndex:arrayValue+8];


if ([starsString isEqualToString:@"S0"]) 
     cell.starsImageView.image = [UIImage imageNamed:@"0-stars.png"];

if ([starsString isEqualToString:@"S0_1"]) 
    cell.starsImageView.image = [UIImage imageNamed:@"0_1-stars.png"];

if ([starsString isEqualToString:@"S1"]) 
    cell.starsImageView.image = [UIImage imageNamed:@"1-stars.png"];

if ([starsString isEqualToString:@"S1_1"]) 
    cell.starsImageView.image = [UIImage imageNamed:@"1_1-stars.png"];

if ([starsString isEqualToString:@"S2"]) 
    cell.starsImageView.image = [UIImage imageNamed:@"2-stars.png"];

if ([starsString isEqualToString:@"S2_1"]) 
    cell.starsImageView.image = [UIImage imageNamed:@"2_1-stars.png"];

if ([starsString isEqualToString:@"S3"]) 
    cell.starsImageView.image = [UIImage imageNamed:@"3-stars.png"];

if ([starsString isEqualToString:@"S3_1"]) 
    cell.starsImageView.image = [UIImage imageNamed:@"3_1-stars.png"];

if ([starsString isEqualToString:@"S4"]) 
    cell.starsImageView.image = [UIImage imageNamed:@"4-stars.png"];

if ([starsString isEqualToString:@"S4_1"]) 
    cell.starsImageView.image = [UIImage imageNamed:@"4_1-stars.png"];

if ([starsString isEqualToString:@"S5"]) 
    cell.starsImageView.image = [UIImage imageNamed:@"5-stars.png"];


//favorite
NSString *IDString = [listOfItems objectAtIndex:arrayValue];

NSLog(@"ID String: %@", IDString);

if (videoerIFavoritDatabase == 0) 
    NSLog(@"Der er ingen videoer i favorit databasen!");


else 

 for(int i=0; i < [tableviewFavoritArray count]; i++) 

     NSLog(@"ID Array Value:%i", i);

     if([IDString isEqualToString:[tableviewFavoritArray objectAtIndex:i]])


    cell.favoriteImageView.image = [UIImage imageNamed:@"favoriteTableview@2x.png"];
    NSLog(@"ER favorit:%i = ID%@", i, [tableviewFavoritArray objectAtIndex:i]);
break;

    else  cell.favoriteImageView.image = [UIImage imageNamed:@"empty.png"];
break;

 
     
    


return cell;



 

【问题讨论】:

【参考方案1】:

您在 if (cell == nil) 语句中进行所有单元配置。仅当 tableView 未从 dequeue 方法返回单元格时,才会执行此代码。可能发生的情况是您正在重复使用单元格并且它们没有被配置,因此数据和外观保持不变。

您的cellForRowAtIndexPath 方法应具有以下结构:

尝试将单元格出列 如果没有返回单元格,请创建一个新单元格并进行任何基线配置(这是您的 if (cell == nil) 语句中的部分 为行适当配置单元格(出列单元格或新单元格)。请记住,您在此处处理的单元格可能是全新的单元格,也可能是以前使用过的单元格。

好的,根据您更新的代码,问题似乎是您正在设置最喜欢的图像,但如果单元格为否,您不会取消设置不再是最爱。如果单元格不是最喜欢的,您需要 else 将该图像设置为零。

【讨论】:

这是一个错字对不起......现在更正它,我的代码看起来不像......对不起 看起来还是不对,你为什么不直接粘贴实际代码呢?在 dequeue 方法后面有一个不应该存在的大括号。看不到真正的代码就很难了! 你是对的..我现在已经发布了所有代码...我唯一的问题是自定义单元格中的图像会被删除,直到我回到我的视图 1 并输入它再次,,, 感谢您的时间和耐心 :) 我在 if 语句之后的 for 循环中尝试了以下内容:else cell.favoriteImageView.image = [UIImage imageNamed:@"empty.png"] ; NSLog(@"不是最喜欢的:%i", i);但这会删除除 1 个最喜欢的图像之外的所有图像,我不知道为什么... 设置好喜欢的图片后,您正在通过数组进行。所以它会找到下一个项目,并将您的图像设置回空。 break;你给后设置喜欢的图片。

以上是关于自定义 Tableview 单元格的问题的主要内容,如果未能解决你的问题,请参考以下文章

单击自定义单元格的 UITextField 后重新加载 TableView

如何在 TableView 中调整自定义单元格的大小?

带有自定义 UITextView 单元格的 TableView 将导航栏滚动到屏幕外

使用调用自定义 tableview 单元格的函数简化 tableview 代码

自定义单元格的“没有重复使用表格单元格的索引路径”问题

如果我有自定义单元格,我可以在 heightForRowAtIndexPath 中调用 tableView cellForRowAtIndexPathtableView 来查找单元格的大小吗?