目标C - UITableViewCell中的ImageView(自定义复选标记)在多个单元格选择后停止切换

时间:2015-09-30 23:00:56

标签: ios objective-c iphone uitableview uiimageview

我在一个简单的列表应用程序(iOS)中遇到了一些我的tableViewCells非常奇怪的行为。

这是我的工作应用的基本功能:
TableView有2个部分。第一部分(例如,有2个单元格)始终可见。可以使用节标题中的自定义按钮显示/隐藏第二部分。我创建了两个类(即FirstSectionItem和SecondSectionItem),它们都具有布尔属性"已完成"和其他一些属性。

编译后,应用程序按预期运行。点击单元格会显示复选标记,再次点击它们会隐藏复选标记(= custom imageView)。然而,在点击一些不同的单元格(随机顺序)或显示/隐藏第二部分之后,无论我多少点击单元格,复选标记(ImageViews)都会保持检查状态。一段时间后,每个单元格都会被检查,并且无法取消选中,但布尔值仍会不断变化。

以下是代码的一部分:

@property NSMutableArray *sectionTitleArray;
@property NSMutableDictionary *sectionContentDict;
@property NSMutableArray *firstSectionItems;
@property NSMutableArray *secondSectionItems;

viewDidLoad中:

- (void)viewDidLoad {

    [super viewDidLoad];

    if (!self.sectionTitleArray) {
        self.sectionTitleArray = [NSMutableArray arrayWithObjects:@"section1", @"section2", nil];
    }

    self.firstSectionItems = [[NSMutableArray alloc] init];
    self.secondSectionItems = [[NSMutableArray alloc] init];
    [self loadInitialData];

    self.sectionContentDict  = [[NSMutableDictionary alloc] init];

    self.arraySection1 = [[NSMutableArray alloc] init];

    for (int i = 0; i < [self.firstSectionItems count]; i++)
         {
             FirstSectionItem *firstSectionItem = [self.firstSectionItem objectAtIndex:i];
             [self.arraySection1 addObject:firstSectionItem.itemName];
         }

     self.arraySection2 = [[NSMutableArray alloc] init];
     for (int i = 0; i < [self.secondSectionItems count]; i++)
        {
             SecondSectionItem *secondSectionItem = [self.secondSectionItems objectAtIndex:i];
             [self.arrayFuture addObject:secondSectionItem.itemName];
        }

    [self.sectionContentDict setValue:self.arraySection1  forKey:[self.sectionTitleArray objectAtIndex:0]];
    [self.sectionContentDict setValue:self.arraySection2 forKey:[self.sectionTitleArray objectAtIndex:1]];
}

的cellForRowAtIndexPath:

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

     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ListPrototypeCell" forIndexPath:indexPath];

     // ... cell content ...

     NSArray *content = [self.sectionContentDict valueForKey:[self.sectionTitleArray objectAtIndex:indexPath.section]];

     //... constraints ...

     UIImage *checkmark = [UIImage imageNamed:@"checkmark.png"];
     UIImage *noCheckmark = [UIImage imageNamed:@"transparent.png"];
     UIImageView *imageView = [[UIImageView alloc] init];

     if (indexPath.section==0){

          FirstSectionItem *firstSectionItem = [self.firstSectionItems objectAtIndex:indexPath.row];
             imageView.image = firstSectionItem.completed ? checkmark : noCheckmark;

}


     if (indexPath.section==1){
        if(self.sec2isTapped == YES){
            SecondSectionItem *secondSectionItem = [self.secondSectionItems objectAtIndex:indexPath.row];
            imageView.image = secondSectionItem.completed ? checkmark : noCheckmark;
         }
      }

     [cell.contentView addSubview:imageView];

     // ... more constraints 


return cell;
}

didSelectRowAtIndexPath方法

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     [tableView deselectRowAtIndexPath:indexPath animated:NO];

    if (indexPath.section ==0){
        FirstSectionItem *tappedItem = [self.firstSectionItems objectAtIndex:indexPath.row];
        tappedItem.completed = !tappedItem.completed;
    }
    if (indexPath.section ==1){
         SecondSectionItem *tappedItem = [self.secondSectionItems objectAtIndex:indexPath.row];
         tappedItem.completed = !tappedItem.completed;
    }

    [tableView beginUpdates];
    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationMiddle];
    [tableView endUpdates];

}

我尝试了多种方法,但似乎没有一种方法可行。我无法弄清问题是什么。

(我是目标C的新手,所以有些部分可能看起来有点狡猾)。

提前致谢。

1 个答案:

答案 0 :(得分:1)

The problem is that you are initializing the UIImageView each time cellForRowAtIndexPath is running. But remember that that cells are reused so what you are doing is reusing a cell that has a checkmark and adding a new clear checkmark on top.

What you need to do is either:

  1. Add the imageView in the storyboard, tag it, and user the tag to find it in the code
  2. Subclass UITableViewCell and assign the correct image in there.

There are MANY articles of how to do both online.