Iphone:滚动时,UITableview中的复选标记会混淆

我有一个问题,我的复选标记,我适用于我的行在我的UITableView得到所有混淆,当我滚动。 我敢肯定,这与iPhone如何重用单元格有关,当我滚动离开,有一个复选标记,它可能会把它放回当我有机会。

有人能给我一些提示,告诉我如何避免这种情况,或者可能看看我的方法,看看是否有什么关系?

我在想,也许我可以保存用户所做的每一行select,然后检查显示哪些行,以确保正确的行得到复选标记,但我不能看到这样做的方式。

非常感谢。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; CustomCell *cell = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[CustomCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; [cell setAccessoryView:nil]; } NSMutableArray *temp = [[NSMutableArray alloc]init]; for (int j = 0; j < [listOfRowersAtPractice count]; j++) { if ([[differentTeams objectAtIndex:indexPath.section] isEqualToString:[[rowersAndInfo objectForKey:[listOfRowersAtPractice objectAtIndex:j]]objectForKey:@"Team"]]) { [temp addObject:[listOfRowersAtPractice objectAtIndex:j]]; } } [cell.cellText setText:[temp objectAtIndex:indexPath.row]]; [temp removeAllObjects]; [temp release]; // Set up the cell... return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; if (cell.accessoryType != UITableViewCellAccessoryCheckmark) { cell.accessoryType = UITableViewCellAccessoryCheckmark; }else { cell.accessoryType = UITableViewCellAccessoryNone; } } 

是在将单元格重置为默认状态并检查行状态并更改状态之后,保存所选行和cellforrowatindexpath中的行的状态。

编辑:

你可以创build一个NSMutabaleArray,其中的条目数等于你的代码中的数据源中的项目数。

在select你实际上可以改变在这个指数的值,像上面创build的数组中的@“selected”一些文本。

在您的cellforrowatindexpath中,您可以选中或取消选中该文本,然后更改单元格的属性。 就像维护一个位图状态的select和未select状态。

给这个去吧:

 static NSString *CellIdentifier = [NSString stringWithFormat:@"Cell %d",indexPath.row]; 

我的应用程序中有一个同样的问题。

至于检查标记,你是否使用核心数据存储?

如果您使用以下….

  - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { NSManagedObject *item = [[self fetchedResultsController] objectAtIndexPath:indexPath]; if ([[item valueForKey:@"checks"] boolValue]) { cell.accessoryType = UITableViewCellAccessoryCheckmark; [cell.textLabel setTextColor:[UIColor redColor]]; [cell.detailTextLabel setTextColor:[UIColor redColor]]; } else { cell.accessoryType = UITableViewCellAccessoryNone; [cell.textLabel setTextColor:[UIColor blackColor]]; [cell.detailTextLabel setTextColor:[UIColor blackColor]]; } } 

和……

  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSManagedObject *selectedObject = [self.fetchedResultsController objectAtIndexPath:indexPath]; if ([[selectedObject valueForKey:@"checks"] boolValue]) { [selectedObject setValue:[NSNumber numberWithBool:NO] forKey:@"checks"]; } else { [selectedObject setValue:[NSNumber numberWithBool:YES] forKey:@"checks"]; } [managedObjectContext save:nil]; } 

每当重复使用单元格时,都需要重置/清除单元格中的所有设置。 所以在这里,当你拿到手机后,

你需要做类似的事情

 CustomCell *cell = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[CustomCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; [cell setAccessoryView:nil]; } cell.accessoryType = UITableViewCellAccessoryNone // This and other such calls to clean up the cell 

您需要刷新单元格的accessoryType,因为单元格被重用,所以它inheritance了重用单元格的accessoryType,这是解决scheme:

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"cellIdentifier"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; //Refresh acessory for cell when tableview have many cells and reuse identifier if([self.tableView.indexPathsForSelectedRows containsObject:indexPath]){ cell.accessoryType = UITableViewCellAccessoryCheckmark; }else{ cell.accessoryType = UITableViewCellAccessoryNone; } cell.textLabel.text = @"Your text cell"; return cell; } 

它为我工作..在索引path中的单元格我已经创build了一个checkboxbutton..后everytym tableview滚动cellForRowAtIndexPath方法被调用,因此我不得不在cellForRowAtIndexPath添加条件,以检查单元格是否有一个检查或未经检查的button

 static NSString *simpleTableIdentifier = @"SimpleTableCell"; SimpleTableCell *cell = (SimpleTableCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; if (cell == nil) { NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SimpleTableCell" owner:self options:nil]; cell = [nib objectAtIndex:0]; } cell.nameLabel.text = [tableData objectAtIndex:indexPath.row]; cell.thumbnailImageView.image = [UIImage imageNamed:[thumbnails objectAtIndex:indexPath.row]]; cell.prepTimeLabel.text = [prepTime objectAtIndex:indexPath.row]; checkbox = [[UIButton alloc]initWithFrame:CGRectMake(290, 5, 20, 20)]; [checkbox setBackgroundImage:[UIImage imageNamed:@"checkbox_empty.png"] forState:UIControlStateNormal]; [checkbox addTarget:self action:@selector(checkUncheck:) forControlEvents:UIControlEventTouchUpInside]; [cell addSubview:checkbox]; if(selectedRows.count !=0) { if([[selectedRows objectAtIndex:indexPath.row]integerValue]==1) { [checkbox setImage:[UIImage imageNamed: @"checkbox_full.png"] forState:UIControlStateNormal]; } else { [checkbox setImage:[UIImage imageNamed: @"checkbox_empty.png"] forState:UIControlStateNormal]; } } return cell; } 

方法来定义checkbox的select是

 - (IBAction)checkUncheck:(id)sender { UIButton *tappedButton = (UIButton*)sender; NSLog(@"%d",tappedButton.tag); if ([[sender superview] isKindOfClass:[UITableViewCell class]]) { UITableViewCell *containerCell = (UITableViewCell *)[sender superview]; NSIndexPath *cellIndexPath = [self.tableView indexPathForCell:containerCell]; int cellIndex = cellIndexPath.row; NSLog(@"cell index%d",cellIndex); [selectedRows insertObject:[NSNumber numberWithInt:1] atIndex:cellIndex]; } NSLog(@"%@",selectedRows); if([tappedButton.currentImage isEqual:[UIImage imageNamed:@"checkbox_empty.png"]]) { [sender setImage:[UIImage imageNamed: @"checkbox_full.png"] forState:UIControlStateNormal]; } else { [sender setImage:[UIImage imageNamed: @"checkbox_empty.png"] forState:UIControlStateNormal]; } } 

不要忘记初始化selectedRows数组..开心编码… !!!