在iPhone上,滑动删除和点击编辑按钮有什么区别?

8

我将视图控制器设置为按照Apple建议的方式使用编辑按钮:

self.navigationItem.rightBarButtonItem = self.editButtonItem;

当用户点击编辑按钮时,会触发setEditing:animated:方法。在这个方法中,我会根据editing的值(即用户可以点击以添加新项目的行)添加或删除“新行”。
当用户在非编辑模式下滑过单元格时,也会调用setEditing:animated:,导致我的代码错误地添加了这个“新行”。它只应该在整个视图控制器处于编辑模式时显示(即当点击编辑按钮时)。
如何解决这个问题?
5个回答

11
如果你实现了tableView:willBeginEditingRowAtIndexPath:tableView:didEndEditingRowAtIndexPath:方法,该方法调用的行为将会改变......
它不再调用setEditing:animated:,你必须在上述两个方法中处理所有编辑变化逻辑。由于这样做的副作用,当滑动手势被触发时,self.editing 将不再是 YES。这是因为setEditing:animated:负责设置self.editing = YES

你能改变删除图标的图片吗? - Vincent Bacalso
你只需要在 willBeginEditingRowAtIndexPath 方法中调用 super,UITableViewController 就会为你设置编辑状态。查看我的答案以了解如何区分编辑按钮点击和在行上滑动。 - malhal
根据我的经验,在Swift 4/iOS 12中,仅仅实现它们并不能改变行为。我必须像下面的答案一样设置一个标志。 - atomkirk

3
使用UITableViewDelegate方法tableView:willBeginEditingRowAtIndexPath:。根据文档:
当用户水平划过一行时,将调用此方法;结果,表视图将其编辑属性设置为YES(从而进入编辑模式),并在由indexPath确定的行中显示删除按钮。在这种“滑动删除”模式下,表视图不会显示任何插入、删除和重新排序控件。此方法为委托提供了一个机会,以使应用程序的用户界面进入编辑模式。当表退出编辑模式(例如,用户点击删除按钮)时,表视图将调用tableView:didEndEditingRowAtIndexPath:
tableView:willBeginEditingRowAtIndexPath:中,设置一个标志,指示使用“滑动删除”触发了编辑模式。然后,在setEditing:animated:中,检查该标志,以查看是使用正常方式触发了编辑模式还是使用滑动删除,并根据该检查执行某些操作。最后,在tableView:didEndEditingRowAtIndexPath:中重置该标志,以便在按下编辑按钮时执行默认操作。

0

当用户点击编辑按钮或在单元格上滑动时,表格都会进入编辑模式。为了区分这两种情况,您可以重写willBeginEditingRowAtIndexPath(记得调用super,否则不会进入编辑模式)并将索引路径存储在属性中。重写setEditing,您可以检查该属性,仅在其为nil时添加插入行(即当用户没有滑动时)。

@interface MasterViewController ()

@property (nonatomic, strong, nullable) NSIndexPath *tableViewEditingRowIndexPath;

@end

@implementation MasterViewController

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath{
    self.tableViewEditingRowIndexPath = indexPath;
    [super tableView:tableView willBeginEditingRowAtIndexPath:indexPath]; // calls setEditing:YES
}

-(void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath{
    [super tableView:tableView didEndEditingRowAtIndexPath:indexPath]; // calls setEditing:NO
    self.tableViewEditingRowIndexPath = nil;
}

- (void)setEditing:(BOOL)editing animated:(BOOL)animated{
    [super setEditing:editing animated:animated];
    if(self.tableViewEditingRowIndexPath){
         // we are swiping
         return;
    }
    if(editing){
        // insert row for adding
    }
    else{
        // remove row for adding
    }
}

0

我不知道你所说的“新行”是什么意思,但你可以将编辑按钮附加到一个帮助方法上,在调用setEditing之前设置一个标志,然后在那里检查是否设置了该标志并相应地进行操作。然后在方法结束时清除该标志。


有没有一种方法可以在不覆盖编辑按钮行为的情况下完成这个操作?如果可能的话,我想使用苹果的建议。(我澄清了问题) - Senseful
添加新行是标准行为吗?我认为“+”或“添加”按钮是一致的做法。如果用户需要按编辑来添加新项目,这将导致大量的支持邮件。 :-) - Eiko
请查看联系人应用程序以添加电子邮件/电话。 - Senseful
@Senseful:那个编辑是完全改变视图,但我理解你的意思。我认为设置一个标记和一个自定义按钮是正确的方法。 - Eiko

0

有意义的是,您必须覆盖setEditing:animated:方法。或者,您可以像Eiko建议的那样在此方法中设置标志。

或者其他方法是

您实现自定义导航栏。在这种情况下,您需要导航栏图像和其上方的2个按钮。将目标添加到该按钮并根据需要实现功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接