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

时间:2011-06-22 09:47:04

标签: iphone ios uitableview swipe

我知道,当我实施tableView:willBeginEditingRowAtIndexPath:tableView:didEndEditingRowAtIndexPath:时,滑动到删除不会在setEditing:animated:处调用UITableViewController(作为UITableView的代表{1}})。

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

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

当然,我可以在tableView:willBeginEditingRowAtIndexPath:的单元格中设置一个标记,告诉它下一次setEditing调用将用于滑动,但这听起来不是好风格。

编辑:它甚至不起作用,因为无法保证调用tableView:didEndEditingRowAtIndexPath:,所以我无法重新设置该标志。

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

5 个答案:

答案 0 :(得分:23)

我认为UITableViewCell的willTransitionToState:实例方法可能正是您所寻找的。像这样:

- (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
    }
}
是吗?

答案 1 :(得分:5)

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

向您的班级添加私有实例变量:

@implementation MyTableViewController {
    BOOL _cellSwiped;
}

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

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

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

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath {
    _cellSwiped = YES;
}

答案 2 :(得分:3)

我做的是这样的:

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    cellSwiped = YES;
    self.editing = NO;
}

然后在

- (void)setEditing:(BOOL)editing animated:(BOOL)animated 

方法我只是检查是否设置了cellSwiped ivar并相应地修改了UI。

答案 3 :(得分:2)

这是一个老问题,但我想知道为什么没有人似乎意识到UITableViewCell内置了showingDeleteConfirmation属性(自iOS 2.0起):< / p>

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    [super setEditing:editing animated:animated];

    BOOL reallyEditing = editing && !self.showingDeleteConfirmation;
    // [...]
}

无需覆盖-willTransitionToState:并手动跟踪状态。

答案 4 :(得分:1)

- (void)tableView:(UITableView *)tableview commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if(editingStyle != UITableViewCellEditingStyleDelete) {
       // add code here

    }
}

调用时,此方法将执行以下操作

UITableViewCellEditingStyleNone,
UITableViewCellEditingStyleDelete,
UITableViewCellEditingStyleInsert

如果您不想使用滑动选项,可以在委托方法中设置bool变量

- (void)willTransitionToState:(UITableViewCellStateMask)state

willTransitionToState将在

之前调用
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath: