我知道,当我实施tableView:willBeginEditingRowAtIndexPath:
和tableView:didEndEditingRowAtIndexPath:
时,滑动到删除不会在setEditing:animated:
处调用UITableViewController
(作为UITableView
的代表{1}})。
我有一个自定义UITableViewCell
实现,在进入编辑模式时执行一些UI重新排列。我希望能够聪明并在表格视图单元格实现本身setEditing:animated:
中实现这些更改(这显然是有意义的)。
但是,在滑动删除时,我仍然会在我的表格视图单元格实现中调用setEditing:animated:
。我没有参数告诉我,我正在刷卡。调用堆栈也没有显示我自己的方法,这些方法可以让我有机会做某事。它显示setEditing:animated
处会调用UITableView
。唯一明显的是,它没有在委托中调用(在这种情况下是我的控制器)。
当然,我可以在tableView:willBeginEditingRowAtIndexPath:
的单元格中设置一个标记,告诉它下一次setEditing
调用将用于滑动,但这听起来不是好风格。
编辑:它甚至不起作用,因为无法保证调用tableView:didEndEditingRowAtIndexPath:
,所以我无法重新设置该标志。
任何想法如何优雅地解决这个问题?
答案 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: