UITableViewCell自定义editAccessoryView - 未正确解散

时间:2011-10-08 20:03:01

标签: ios uitableview

我已经实现了自定义编辑附件视图,如我对this问题的回答中所述。在大多数情况下它工作得很好,但我注意到它有一个小问题。

当我在表格视图中滚动或选择另一行时,我的自定义编辑附件不会被解除。使用标准编辑附件(删除按钮),可以捕获表格上任何其他位置的触摸并用于删除删除附件视图 - 您可以在内置的Notes应用程序中自行查看,例如,或在任何其他位置使用标准编辑附件视图。

这一定是因为我在刷卡到删除模式时返回UITableViewEditingStyleNone。但是,如果我返回任何其他模式,则不会显示我的自定义编辑附件。

如何恢复标准编辑样式的功能,在桌面视图的任何位置触摸都会消除编辑附件?

单元格没有子类,但是它是从具有自定义布局的nib文件加载的。编辑附件视图是nib文件的一部分,通过editingAccessoryView插座连接。

我已经设法通过存储滑动到编辑行的索引路径来实现我想要的效果,并且如果选择了另一行或者在表格上滚动,则将该单元格设置为编辑模式。但是,我想做得好。

1 个答案:

答案 0 :(得分:2)

我能够解决这个问题,但遗憾的是它需要额外的腿部工作,并不像设置几个属性一样简单。

在我的

- (UITableViewCellEditingStyle)tableView:(UITableView *)_tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath

方法我返回UITableViewCellEditingStyleNone,以便显示我的自定义editingAccessoryView。在这种方法中我也这样做:

self.tableView.scrollEnabled = NO;
if(self.editingPath)
{
    [[tableView cellForRowAtIndexPath:editingPath] setEditing:NO animated:YES];
}

self.editingPath = indexPath;    
for (UITableViewCell *cell in [tableView visibleCells])
{
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}

这会禁用滚动,然后存储我们刷过的indexPath以供日后使用。如果您在编辑行时滑动另一行,则会在第一行编辑并编辑第二行,这就是苹果应用的行为方式。我还将所有可见单元格上的单元格selectionStyle设置为UITableViewCellSelectionStyleNone。当用户在当前正在编辑的单元格中选择另一个单元格时,这会减少蓝色闪烁。

接下来,我们需要在点击另一个单元格时关闭accessoryView。为此,我们实现了这个方法:

-(NSIndexPath *)tableView:(UITableView *)_tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(self.editingPath)
{
    UITableViewCell *c = [tableView cellForRowAtIndexPath:self.editingPath];
    [c setEditing:NO animated:YES];

    self.tableView.scrollEnabled = YES;
    self.editingPath = nil;
    for (UITableViewCell *cell in [tableView visibleCells])
    {
        cell.selectionStyle = UITableViewCellSelectionStyleBlue;
    }

    return nil;
}

return indexPath;
}

当有人即将点击一个单元格时,如果我们正在编辑那么这就是那个单元格并且不返回任何内容。

也适用于

-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath

我返回YES,以便对我希望用户能够删除的单元格进行编辑。