如何避免在UITableViewCell上滑动删除调用setEditing

Bjö*_*ser 16 iphone uitableview swipe ios

我知道,当我实现tableView:willBeginEditingRowAtIndexPath:并且tableView:didEndEditingRowAtIndexPath:,刷卡到删除不会调用setEditing:animated:UITableViewController(作为代表UITableView).

我有一个自定义UITableViewCell实现,在进入编辑模式时执行一些UI重新排列.我想要聪明并setEditing:animated:在表视图单元实现本身实现这些更改(这显然是有意义的).

但是,当滑动删除时,我仍然会setEditing:animated:在我的表视图单元格实现中调用.我没有参数告诉我,我正在刷卡.调用堆栈也没有显示我自己的方法,这些方法可以让我有机会做某事.它显示了setEditing:animated被称为UITableView.唯一显而易见的是,它没有在委托中调用(在这种情况下我的控制器).

当然,我可以在单元格中设置一个标志tableView:willBeginEditingRowAtIndexPath:,告诉它下一个setEditing调用是刷卡,但这听起来不是好风格.

编辑:它甚至不起作用,因为它不能保证tableView:didEndEditingRowAtIndexPath:被调用,所以我不能将标志设置回来.

任何想法如何优雅地解决这个问题?

Fil*_*lic 24

我认为UITableViewCell的willTransitionToState: instance方法可能正是您所寻找的.像这样的东西:

- (void)willTransitionToState:(UITableViewCellStateMask)state
{
    if (state == UITableViewCellStateShowingDeleteConfirmationMask) {
        swipedToDelete = YES; // BOOL ivar
    }
}

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    if (swipedToDelete) {
        // do your stuff, or don't
    }
}
Run Code Online (Sandbox Code Playgroud)

是吗?

  • 如果添加[super willTransitionToState:state]; 在您的代码中,您可以保留常见的单元行为.以防有人(像我一样)复制并粘贴此方法,并想知道为什么单元格中的图标消失了..;) (4认同)

Guj*_*min 5

我知道这可能已经完成了死亡,但所提出的解决方案似乎并不是一个完整的简单答案,它们似乎也没有提供良好的示例代码,所以我想我会添加我的答案.

向您的类添加一个私有实例变量:

@implementation MyTableViewController {
    BOOL _cellSwiped;
}
Run Code Online (Sandbox Code Playgroud)

覆盖setEditing方法以查找_cellSwiped变量,仅在我们不滑动时传播.人们似乎缺少的部分是_cellSwiped需要重置为NO,否则你将无法在刷卡后使用编辑按钮!

- (void) setEditing:(BOOL)editing animated:(BOOL)animated {
    if (!_cellSwiped) {
        [super setEditing:editing animated:animated];
    } else if (!editing) {
        _cellSwiped = NO;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,添加此方法覆盖以检测滑动:

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath {
    _cellSwiped = YES;
}
Run Code Online (Sandbox Code Playgroud)