我有一个动态表格,用户可以在其中添加&删除数据。该表显示购物清单。如果购物完成,用户应该能够勾选所需的项目并且也应该能够解开,我已经通过设置附件按钮来实现这一点。但是,问题来自于我从中删除了一行,单元格被删除但是附加到该单元格的附加按钮保持相同的状态。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell.accessoryView == nil)
{
cell.accessoryView= [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tick_btn"]]; } else { cell.accessoryView = nil;
}
}
答案 0 :(得分:0)
由于UITableView
通常会重复使用UITableViewCell
的实例,因此您必须确保'-tableView:cellForRowAtIndexPath:
方法正确设置了单元格的所有属性。其他陈旧数据可能会持续存在。我猜这可能是你的问题,缺乏对你的代码的全面了解。
所以,像这样:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString* cellIdentifier = @"TheCellIdentifier";
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
ShoppingObject* shopping = [self.myShoppingList objectAtIndex:indexPath.row];
UIImageView* accessoryView = nil;
if (shopping.isDone) {
accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tick_btn"]];
}
cell.accessoryView = accessoryView;
return cell;
}
它通过重用缓存或创建新缓存来获取单元。然后,它会检查数据模型的状态,以查看是否对该行中表示的对象进行了购物,如果已完成购物,则会为您提供图像。请注意,购物没有完成,没有创建accessoryView,因此无论ShoppingObject在该表行中的状态如何,都将正确设置该单元的accessoryView。
那么我在-tableView:didSelectRowAtIndexPath:
中可能会做的只是在表格上-reloadData
,以确保所有内容都能正确更新。
答案 1 :(得分:0)
您需要跟踪所选项目
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell.accessoryView == nil)
{
cell.accessoryView= [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tick_btn"]];
[self.checkedIndexPaths addObject:indexPath];
}
else {
cell.accessoryView = nil;
[self.checkedIndexPaths removeObject:indexPath];
}
}
修改
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Do other stuffs
cell.accessoryView = nil;
if ([self.checkedIndexPath containsObject:indexPath]) {
cell.accessoryView= [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tick_btn"]];
}
}