如何解释“ completionHandler(true)”

时间:2019-03-23 17:02:34

标签: ios swift

我正在关注有关TableView Cell滑动操作的在线教程。 除了completionHandler(true)

之外,我可以向我自己解释每一行

这是代码段

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

    let deleteAction = UIContextualAction(style: .destructive, title: "Delete") { (action, sourceView, completionHandler) in
        //Delete
        self.restaurantNames.remove(at: indexPath.row)
        self.restaurantLocations.remove(at: indexPath.row)
        self.restaurantTypes.remove(at: indexPath.row)
        self.restaurantIsVisited.remove(at: indexPath.row)
        self.restaurantImages.remove(at: indexPath.row)

        self.tableView.deleteRows(at: [indexPath], with: .fade)
        // Call completion handler to dismiss the action button
        completionHandler(true)
    }

    let shareAction = UIContextualAction(style: .normal, title: "Share") { (action, sourceView, completionHandler) in
        let defaultText = "Just checking in at" + self.restaurantNames[indexPath.row]
        let activityController = UIActivityViewController(activityItems: [defaultText], applicationActivities: nil)
        self.present(activityController, animated: true, completion: nil)
        // Call completion handler to dismiss the action button
        completionHandler(true)
    }

    let swipeConfiguration = UISwipeActionsConfiguration(actions: [deleteAction, shareAction])

    return swipeConfiguration
}

我不太明白这是什么意思? 预先感谢

4 个答案:

答案 0 :(得分:2)

实际上,completionHandler行之前的注释说明了目的。完成处理程序是一个闭包,必须在操作结束时调用它以关闭操作并传递状态值。

来自documentation

的更多信息
  

completionHandler

     

您将在执行操作后执行的处理程序块。此块没有返回值,并采用以下参数:

     

actionPerformed

     

一个布尔值,指示您是否执行了该操作。如果您执行了操作,请指定true;如果由于某种原因而无法执行操作,请指定false

答案 1 :(得分:2)

说明::您使用true调用完成处理程序以指示您执行了操作,如果由于某种原因而无法执行,则返回false。

检查下面的演示代码工作:

func contextualToggleFlagAction(forRowAtIndexPath indexPath: IndexPath) -> UIContextualAction {

        var email = data[indexPath.row]

        let action = UIContextualAction(style: .normal,
                                        title: "Flag") { (contextAction: UIContextualAction, sourceView: UIView, completionHandler: (Bool) -> Void) in

            if email.toggleFlaggedFlag() {

                self.data[indexPath.row] = email
                self.tableView.reloadRows(at: [indexPath], with: .none)

                completionHandler(true) // your task is successfully done.
            } else {

                completionHandler(false) // With some reason you unable to perform task so now you returning false.
            }
        }

        action.image = UIImage(named: "flag")
        action.backgroundColor = email.isFlagged ? UIColor.gray : UIColor.orange
        return action
    }

答案 2 :(得分:1)

UIContextualAction处理程序的第三个参数是一个闭包,它告诉UIContextualAction是否执行了该操作。通过调用completionHanlder(true),您可以通知UIContextualAction您执行了请求的操作。例如,如果处理程序中出现错误而使您无法执行所需的操作,则可以通过调用completionHandler(false)来通知处理程序。

文档:https://developer.apple.com/documentation/uikit/uicontextualaction/handler

答案 3 :(得分:0)

所有现有答案都只是粘贴Apple的文档,而该文档恰恰没有答案。它说什么时候应该调用它,但它对用户界面的作用却没有。

据我所知,使用任何一个值调用completionHandler都会折叠按钮。您可以通过延迟dispatch_after块中的完成处理程序来看到此操作。在测试中指定true与false无关。

我感觉自己缺少一些东西,但是Apple的文档在这里不透明。