删除行时,编辑操作部分将忽略UITableViewRowAnimation设置

时间:2016-11-17 00:00:18

标签: ios swift uitableview

如果我在表视图行上滑动以删除它,那么该行不会被视为一个完整的实体 - 我的意思是单元格的编辑操作部分总是通过向上滑动来解散自身,但是其余的单元格根据为UITableViewRowAnimation设置的任何值来解散自己。

因此,例如,如果使用deleteRows(... .left)删除下面的行,则该行的白色部分将滑到屏幕的左侧,但UNBLOCK部分会单独运行 - 它总是在屏幕上滑动,而不管deleteRows中使用的UITableViewRowAnimation值。

enter image description here

代码如下:

override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    let deleteAction = UITableViewRowAction(style: .default, title: "UNBLOCK") { action, index in
        self.lastSelectedRow = indexPath
        let callerToUnblock = self.blockedList[indexPath.row]
        self.unblockCaller(caller: callerToUnblock)
    }
    deleteAction.backgroundColor = UIColor.tableViewRowDeleteColor()
    return [deleteAction]
}

func unblockCaller(caller:Caller) {
    DispatchQueue.global(qos: .background).async {
        Model.singleton().unblockCaller(caller) {(error, returnedCaller) -> Void in
            if error == nil {
                DispatchQueue.main.async {
                    if let lastSelectedRow = self.lastSelectedRow {
                        self.tableView.deleteRows(at: [lastSelectedRow], with: .left)
                    }
                }
                ...

有人知道如何让整行一致地移动吗?

1 个答案:

答案 0 :(得分:0)

正确。这两个对象表现为单独的实体。您无法控制UITableViewRowAction按钮在UITableViewCell框架之外绘制的动画。

请参阅此捕获的视图层次结构中的UITableViewCellDeleteConfirmationView布局。 (请注意蓝色中的UITableViewCell框架如何不包含红色中的UITableViewCellDeleteConfirmationViewExpanded view showing that the cell is not clipping the button

修复

在删除单元格之前隐藏编辑按钮。它将在细胞删除动画之前被删除,然后其余细胞向上滚动。

func unblockCaller(caller:Caller, indexPath:IndexPath) {
    // Perform the deletion
    // For example: self.blockedList.remove(at: indexPath.row)

    // if error == nil...
    DispatchQueue.main.async {
        self.tableView.setEditing(false, animated: false)
        self.tableView.deleteRows(at: [indexPath], with: .left)
    }
}

Animation of the deletion

其他评论

  1. 我建议使用状态变量来跟踪必须删除的单元格(self.lastSelectedRow = indexPath)。将路径传递给worker方法,以便更好地隔离任务。
  2. 尽可能使用标准外观;如果UNBLOCK按钮只是一个红色控件,则更喜欢style: .destructive并避免使用自定义颜色方案。 editActionsForRowAt成为单行
    self.unblockCaller(caller: self.blockedList[indexPath.row], indexPath: indexPath)