我知道,当我实现tableView:willBeginEditingRowAtIndexPath:和tableView:didEndEditingRowAtIndexPath:时,滑动到删除并不会调用setEditing:animated: at my UITableViewController (作为UITableView的代表)。
我有一个定制的UITableViewCell实现,它在编辑模式时做一些UI重新安排。我想聪明一点,在表视图单元实现本身(这显然是有意义的)实现setEditing:animated:中的这些更改。
但是,在滑动删除时,我仍然会在表视图单元格实现中得到对setEditing:animated:的调用。而且我没有任何参数可以告诉我我在滑动。调用堆栈也没有显示任何我自己的方法可以让我有机会做一些事情。它显示setEditing:animated在UITableView中被调用。唯一明显的是,它不是在委托处调用的(在本例中是我的控制器)。
当然,我可以在tableView:willBeginEditingRowAtIndexPath:中的单元格上设置一个标志,告诉它下一个setEditing调用将用于滑动,但听起来不太好。
编辑:它甚至不能工作,因为不能保证调用tableView:didEndEditingRowAtIndexPath:,所以我不能将标志设置回原来的位置。
有什么好办法解决这个问题吗?
发布于 2011-08-06 15:34:18
我认为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
}
}是这样吗?
发布于 2013-03-28 22:44:43
我知道这可能已经完成了,但提出的解决方案似乎不是一个完整的简单答案,它们似乎也没有提供良好的示例代码,所以我想我应该添加我的答案。
在类中添加一个私有实例变量:
@implementation MyTableViewController {
BOOL _cellSwiped;
}重写setEditing方法以查找_cellSwiped变量,并且只在不滑动的情况下传播。人们似乎缺少的部分是,_cellSwiped需要重新设置为否,否则,您将永远无法使用编辑按钮后,滑动!
- (void) setEditing:(BOOL)editing animated:(BOOL)animated {
if (!_cellSwiped) {
[super setEditing:editing animated:animated];
} else if (!editing) {
_cellSwiped = NO;
}
}最后,添加此方法覆盖以检测swipe:
- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath {
_cellSwiped = YES;
}发布于 2011-07-23 02:18:20
我所做的是这样的:
- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
cellSwiped = YES;
self.editing = NO;
}然后在
- (void)setEditing:(BOOL)editing animated:(BOOL)animated 方法只需检查是否设置了cellSwiped ivar并相应地修改UI。
https://stackoverflow.com/questions/6437916
复制相似问题