Je suis un tutoriel en ligne concernant une action de balayage de cellule TableView.
Je peux m'expliquer chaque ligne, sauf completionHandler(true)
Ceci est l'extrait de code
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
}
Je ne comprends pas très bien ce Est-ce que ça veut dire? Merci d'avance
4 Réponses :
Le troisième paramètre du gestionnaire UIContextualAction est une fermeture qui indique à UIContextualAction si vous avez effectué ou non l'action. En appelant completionHanlder (true) , vous notifiez UIContextualAction que vous avez effectué l'action demandée. Si, par exemple, il y avait une erreur dans votre gestionnaire qui vous empêchait d’effectuer l’action souhaitée, vous pouvez en informer le gestionnaire en appelant completionHandler (false) .
Documentation: https://developer.apple.com/documentation/uikit/uicontextualaction / handler
En fait, le commentaire avant la ligne completionHandler explique le but. Le gestionnaire d'achèvement est une fermeture qui doit être appelée à la fin de l'action pour rejeter l'action et transmettre une valeur de statut.
Plus d'informations dans la documentation
< finalcompletionHandler
Le bloc de gestionnaire que vous devez exécuter après avoir effectué l'action. Ce bloc n'a pas de valeur de retour et prend le paramètre suivant:
actionPerformedUne valeur booléenne indiquant si vous avez effectué l'action. Spécifiez
truesi vous avez effectué l'action oufalsesi vous n'avez pas pu effectuer l'action pour une raison quelconque.
Explication: Vous appelez le gestionnaire d'achèvement avec true pour indiquer que vous avez effectué l'action ou false si vous ne pouvez pas pour une raison quelconque.
Vérifiez ci-dessous le travail du code de démonstration: strong >
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
}
Toutes les réponses existantes collent simplement la documentation d'Apple qui ne répond précisément à rien. Il indique quand il doit être appelé mais rien sur ce qu'il fait à l'interface utilisateur.
Pour autant que je sache, appeler completionHandler avec l'une ou l'autre des valeurs réduira les boutons. Vous pouvez voir cela en action en appelant le gestionnaire d'achèvement dans un bloc dispatch_after avec un délai. Spécifier vrai ou faux ne fait aucune différence dans mes tests.
J'ai le sentiment qu'il me manque quelque chose, mais la documentation d'Apple est opaque ici.