iphone - 自定义 Tableview 单元格出现问题

标签 iphone ios uitableview tableview reloaddata

我的应用程序由 3 个 View 组成( View 1 (Tableview1)、 View 2 (Tableview2)、 View 3 (DetailView))。

我在 View 2 (Tableview2) 中设置了一个带有 subview (imageView 和标签)的自定义表格 View 单元格。

这些 subview 之一是 ImageView,如果单元格 ID 位于收藏夹数组中,则包含图像。当您选择 cellForRowAtIndexpath 时,您将被推送到新 View ( View 3 (DetailView)),您可以在其中按下按钮并将该项目设为收藏夹。 当您关闭该 View 并返回时,将显示图像,并且一切正常。

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

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

数组在 ViewWillAppear 处更新...

可能是什么问题?

相关代码:编辑 - 发布了 cellForRowAtIndexPath 中的所有相关代码:一切都显示正确,但如果我从自定义单元格中删除图像,则表格 View 不会更新...编辑:用 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;



 }

最佳答案

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

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

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

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

关于iphone - 自定义 Tableview 单元格出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7498770/

相关文章:

iphone - 在 .h 中定义时将对象添加到 NSMutableArray

ios - 一种有选择地将 UILocalNotification 传递到 iPhone 和 Apple Watch 的方法?

ios - 显示 slider InAppSettings 套件的选定值

ios - 尝试加载本地 html 文件时 UIWebView 崩溃

ios - 如何将视频文件发送到 ios 中的 firebase 存储

ios - 无法在 plist 文件 xcode 5 中添加行

ios - 带有以编程方式添加的图像的 UITableViewAutomaticDimension

ios - 改变 TableView 或 TableViewCell 的宽度

ios - 如何从 swift(iOS) 重定向 Skype 应用程序

ios - 在两个 UITableViewCells 之间添加一个 View ( ImageView )