如何使用 UIActionSheet 确认删除 UITableViewCell

Posted

技术标签:

【中文标题】如何使用 UIActionSheet 确认删除 UITableViewCell【英文标题】:How to use a UIActionSheet to confirm deletion of a UITableViewCell 【发布时间】:2012-02-03 06:14:16 【问题描述】:

我有一个标准的 CoreData/NSFetchedResultsController/UITableView 设置。顶部没有编辑按钮,但向右滑动一行将显示删除按钮。如果按下删除按钮,我想弹出一个 UIActionSheet 来确认删除。

在 UIActionSheet 之前,我刚刚实现了tableView:commitEditingStyle:forRowAtIndexPath:,并在其中为 indexPath 调用了 managedObjectContext 上的deleteObject:,并让 FetchedResultsController 覆盖处理它的视觉方面。

现在,我有 tableView:commitEditingStyoe:forRowAtIndexPath: 创建 UIActionSheet 并显示它。我实现了actionSheet:clickedButtonAtIndex: 并将deleteObject: 放在按下删除按钮的情况下。问题是我需要删除项目的 indexPath 并且它不再在范围内。

我...

A) 删除tableView:commitEditingStyle:forRowAtIndexPath: 中的ManagedObject 并在actionSheet:clickedButtonAtIndex: 中保存或回滚?

B) 将索引路径存储为属性,以便我可以在tableView:commitEditingStyle:forRowAtIndexPath: 中设置它并在actionSheet:clickedButtonAtIndex: 中读取它?

C) 别的东西……

选项 A 似乎比必要的开销更大。无论哪种方式,它都会被删除,只是有时会被回滚。

选项 B 似乎非常鹰派。像这样的外部值似乎不太适合面向对象的模型。

UIActionsSheet 中是否有一个通用对象用于传递这样的值?还是我还缺少其他东西?

【问题讨论】:

【参考方案1】:

我需要一个类似的解决方案。我通过创建一个 ivar NSIndexPath * currentPath; 解决了这个问题,并将以下想法用于 tableView:commitEditingStyle:forRowAtIndexPath:

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

    UIAlertView     * alert;
    UITableViewCell * cell;
    if (editingStyle == UITableViewCellEditingStyleDelete)
    
        // save current indexPath
        [currentPath release];
        currentPath = [indexPath retain];

        // display warning
        alert = [[UIAlertView alloc] initWithTitle:@"Really?"
                message:@"Are you really really sure you want to delete this item?"
                delegate:self
                cancelButtonTitle:@"Cancel"
                otherButtonTitles:@"Delete", nil];
        [alert show];
        [alert release];

        // clear delete confirmation from table view cell
        cell = [tableView cellForRowAtIndexPath:indexPath];
        [cell setEditing:NO animated:NO];
        [cell setEditing:YES animated:YES];
     ;
     return;
  

如果用户点击删除按钮,我会从 UITableViewCell 中删除该行并从数据源中删除该条目。如果他们点击取消,我会直接忽略该操作。

【讨论】:

【参考方案2】:

我会将托管对象本身存储在 -tableView:commitEditingStyle:forRowAtIndexPath: 方法中的属性中,而不是 indexPath:

self.deleteCandidate = [self.controller objectAtIndexPath:indexPath]

然后在-actionSheet:clickedButtonAtIndex: 中删除(或不删除)该对象,并在任一情况下设置self.deleteCandidate = nil

原因是获取的结果控制器对象可能会在被调用的这两个方法之间发生变化。

另一种选择是使用“关联引用”(objc_setAssociatedObject,objc_getAssociatedObject)来存储从 UIActionSheet 到相关对象的引用。

【讨论】:

以上是关于如何使用 UIActionSheet 确认删除 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

如何根据人机界面指南在 iPad 上进行删除确认

如何在 xcode 中创建“删除”操作表?

在 iPad 上使用 UIActionSheet 时暗淡并锁定背景

如何从 iOS 7 中的 UIActionsheet 中删除分隔线?

从 UICollectionView 中删除一个项目

如何检测在表视图委托方法中调用的 UIActionSheet 按钮的点击?