UITableViewCell自定义editingAccessoryView – 没有正确解雇

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

当我在表格视图中滚动或select另一行时,我的自定义编辑附件不会被解除。 使用标准的编辑附件(删除button),可以捕捉桌面上其他任何地方的触摸并用于删除删除附件视图 – 例如,您可以在内置的Notes应用程序中或在任何其他位置一个标准的编辑配件视图。

这一定是因为我在刷卡模式下返回UITableViewEditingStyleNone 。 但是,如果我返回任何其他模式,那么我的自定义编辑配件不会显示。

我怎样才能找回标准编辑风格的function,在桌面视图的任何位置触摸都可以取消编辑附件?

单元格不是子类,但是它是从一个自定义布局的nib文件加载的。 编辑附件视图是nib文件的一部分,并通过editingAccessoryView出口连接。

如果select了另一行或在表格上开始滚动,我已经设法中途实现了我想要的效果,方法是存储滑动到编辑的行的索引path,并将该单元格设置为编辑模式。 不过,我想正确地做。

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

在我的

 - (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 。 这可以减less用户在当前正在编辑的时候select另一个单元格的蓝色闪烁。

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

 -(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; } 

这是什么时候有人要点击一个单元格,如果我们正在编辑然后unedit单元格,什么都不返回。

也为

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

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