如何在取消时取消滑动动作上下文菜单

时间:2019-03-12 00:05:31

标签: ios swift uitableview uiswipeactionsconfiguration

我使用

添加了滑动以删除功能
override func tableView(_ tableView: UITableView, 
        trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) 
         -> UISwipeActionsConfiguration?

我正在调用带有撤消/确认操作的警报。关闭后,我想关闭滑动操作菜单。

    override func tableView(_ tableView: UITableView,
                            trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {

        let deleteClosure:UIContextualAction.Handler = {
            (action:UIContextualAction,
            view:UIView,
            completionHandler:(Bool) -> Void) in
            let alert = self.confirmDeletion({ _ in

                let row = indexPath.row;
                let removed = self.logList.remove(at: row);
                self.deleteLogEntry(removed);
                //
                tableView.reloadData();
                //

            }, declineBlock: {_ in
                tableView.reloadData();// this hides it but w/o animation
            });
            DispatchQueue.main.async {
                self.present(alert, animated: true, completion: nil);
            }
        }
        let deleteAction = UIContextualAction(style: .destructive, title: "Delete", handler: deleteClosure);

        return UISwipeActionsConfiguration(actions: [deleteAction]);
    }

到目前为止,我发现重新加载表格数据将关闭尾随的滑动菜单,但是没有动画,看起来很奇怪。有没有办法让它随动画一起消失?

**有关重复的说明** 在删除行之后标记为重复的问题被认为是重复的,因为该问题不能按预期工作,在这里不是这种情况。当用户取消删除并且未删除行时,我想消除拖尾滑动。


我已经尝试过的:

  • tableView.setEditing(false, animated: true);-没有明显区别
  • tableView.reloadRows(at: [indexPath], with: UITableView.RowAnimation.automatic);-使用动画向右移动了行,但按钮重叠了
  • tableView.resignFirstResponder();-没有明显的区别(我不得不尝试)
  • tableView.reloadTable()-取消了滑动菜单,但没有动画效果

1 个答案:

答案 0 :(得分:1)

您需要调用completionHandler及其结果来取消滑动操作。这是UIContextualActionHandler的帮助;

// call the completionHandler to reset the context to its normal state (e.g. when swiping, resets to unswiped state)
// pass YES to the completionHandler if the action was actually performed, to show a visual indication of the successful completion
typedef void (^UIContextualActionHandler)(UIContextualAction *action, __kindof UIView *sourceView, void(^completionHandler)(BOOL actionPerformed));