Answers:
好的,事实证明这很容易。这是我为解决此问题所做的事情:
物镜
- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Detemine if it's in editing mode
if (self.tableView.editing)
{
return UITableViewCellEditingStyleDelete;
}
return UITableViewCellEditingStyleNone;
}
迅捷2
override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {
if tableView.editing {
return .Delete
}
return .None
}
迅捷3
override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
if tableView.isEditing {
return .delete
}
return .none
}
您仍然需要实施tableView:commitEditingStyle:forRowAtIndexPath:
删除操作。
您需要实现CanEditRowAt函数。
您可以在EditingStyleForRowAt函数中返回.delete,因此仍可以在编辑模式下删除。
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
if tableView.isEditing {
return true
}
return false
}
func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
return .delete
}
基本上,您可以使用以下方法启用或禁用编辑
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
如果启用了编辑,则会显示红色的删除图标,并向用户请求删除确认。如果用户确认,则委托方法
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
通知删除请求。如果您实施此方法,则将自动激活“删除”。如果您未实现此方法,则滑动“删除”功能无效,但是您实际上无法删除该行。因此,据我所知,除非使用某些未记录的私有API,否则您将无法实现所需的功能。大概这就是Apple应用程序的实现方式。
在C#上:
我有一个相同的问题,需要在滑动时使用“删除”选项来启用/禁用行。多行需要向左滑动并删除,使它们保持另一种颜色。我使用了这种逻辑。
[Export("tableView:canEditRowAtIndexPath:")]
public bool CanEditRow(UITableView tableView, NSIndexPath indexPath)
{
if (deletedIndexes.Contains(indexPath.Row)){
return false;
}
else{
return true;
}
}
请注意,deletedIndexes是从表中删除的索引列表,没有重复项。此代码检查是否删除了一行,然后禁用了滑动,反之亦然。
等效的委托函数是Swift is canEditRowAtIndexPath
。
我也遇到了这个问题,并在下面的代码中进行了修复。希望对您有帮助。
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
BOOL deleteBySwipe = NO;
for (UIGestureRecognizer* g in tableView.gestureRecognizers) {
if (g.state == UIGestureRecognizerStateEnded) {
deleteBySwipe = YES;
break;
}
}
if (deleteBySwipe) {
//this gesture may cause delete unintendedly
return;
}
//do delete
}
}