我正在关注有关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
}
我不太明白这是什么意思? 预先感谢
答案 0 :(得分:2)
实际上,completionHandler
行之前的注释说明了目的。完成处理程序是一个闭包,必须在操作结束时调用它以关闭操作并传递状态值。
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的文档在这里不透明。