动画后 UITableViewRowAction 完成

UITableViewRowAction completion after animation

在我的 table 中,我有一个 UITableViewRowAction 对应 editActionsForRowAtIndexPath。当我按下它时,它会删除我数组中的所有数据,从而触发以视图更改结尾的数组上的 didSet。代码如下所示:

var data: [Int] = [Int]() {
    didSet {
        if data.isEmpty {
            // change view
        }
    }
}

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? {
    var confirm = UITableViewRowAction(style: .Default, title: "Confirm") { (action: UITableViewRowAction!, indexPath: NSIndexPath!) -> Void in
        self.data.removeAll(keepCapacity: false)
        self.tableView.setEditing(false, animated: true)
    }
    return [confirm]
}

我想要得到的是在 UITableViewRowAction 的动画完成后的某种完成(行移回原位),然后清空数组并更改视图。如果可能的话,我想避免使用手动延迟。

试试这个代码:

var data: [Int] = [Int]() {
    didSet {
        if data.isEmpty {
            // change view
        }
    }
}

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? {
    var confirm = UITableViewRowAction(style: .Default, title: "Confirm") { (action: UITableViewRowAction!, indexPath: NSIndexPath!) -> Void in
        CATransaction.begin()
        CATransaction.setCompletionBlock({
            self.data.removeAll(keepCapacity: false)
        })
        self.tableView.setEditing(false, animated: true)
        CATransaction.commit()
    }
    return [confirm]
}

CATransaction.setCompletionBlock({/* completion code */}) 中的代码是 运行 在 CATransaction.begin()CATransaction.commit() 之间的其他代码完成执行之后。所以这里 self.data.removeAll(keepCapacity: false) 应该在 self.tableView.setEditing(false, animated: true) 完成动画后被调用。

希望对您有所帮助!

注意:我自己没有用 tableView.setEditing(...) 测试过这段代码,但我已经将它用于 tableView.deleteRowsAtIndexPaths(...)