我有一个启用滚动的 UITableViewController,嵌入在 UIContainerView 中。在 tableview 中有一个自定义 UITableViewCell ,其中有一个 UIImageView ,当您在 tableview 中选择多个单元格之一时,我获取索引路径并将所选单元格的图像视图设置为显示一个刻度。表格视图由数组中的多条数据动态填充。简单的。
问题是,因为 tableview 比在容器视图中可见的要长,似乎索引路径仅适用于可见内容。这意味着它将具有相应索引路径的单元格设置为带有刻度的可见单元格。
假设五个单元格可见,则选择第四个。你再往下走五个单元格,并且在应该是第十个单元格的地方打了一个勾,但从技术上讲,它是不可见内容的第五个单元格。我认为这与细胞重复使用有关,但我不确定该怎么做。
如何解决这个问题?(代码如下)
- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
CuisineTableCell *cell = [tableView cellForRowAtIndexPath:indexPath];
//Store current view in defaults
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (cuisineSelected == NO) {
cuisineSelected = YES;
cell.imageView.image = [UIImage imageNamed:@"TickedCircle"];
//Set cuisine one defaults
[defaults setObject:[cuisinesArray objectAtIndex:indexPath.row] forKey:@"filterCuisineString"];
[defaults synchronize];
selectedRow = [tableView indexPathForSelectedRow];
}
else if(indexPath.row == selectedRow.row) {
cuisineSelected = NO;
cell.imageView.image = [UIImage imageNamed:@"UntickedCircle"];
//Set cuisine one defaults
[defaults setObject:@"" forKey:@"filterCuisineString"];
[defaults synchronize];
selectedRow = NULL;
}
else {
CuisineTableCell *selectedCell = [tableView cellForRowAtIndexPath:selectedRow];
selectedCell.imageView.image = [UIImage imageNamed:@"UntickedCircle"];
// the one and only cell in the section
cuisineSelected = YES;
cell.imageView.image = [UIImage imageNamed:@"TickedCircle"];
//Set cuisine one defaults
[defaults setObject:[cuisinesArray objectAtIndex:indexPath.row] forKey:@"filterCuisineString"];
[defaults synchronize];
selectedRow = [tableView indexPathForSelectedRow];
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"filterCuisineCell";
CuisineTableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cuisineSelected == NO) {
cell.imageView.image = [UIImage imageNamed:@"UntickedCircle"];
}
cell.textLabel.text = [cuisinesArray objectAtIndex:indexPath.row];
return cell;
}