En utilisant Swift pour une application fonctionnant dans iOS 8, je dois écrire un gestionnaire de complétion pour la variable UIActivityViewController
afin de capturer les résultats de la méthode "partagée" sélectionnée par l'utilisateur.
Ceci est un extrait du code que j'ai jusqu'à présent. Ma question est de savoir comment définir le avc.completionWithItemsHandler
? Je suis sûr que c'est simple, mais je ne le vois pas.
var activityItems = NSMutableArray()
activityItems.addObject("Email or text for 'share' goes here")
var avc = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
avc.setValue("Subject for Email", forKey: "Subject")
avc.completionWithItemsHandler = //Here is where I dont know what to do.
self.navigationController?.presentViewController(avc, animated: true, completion: nil)
Les typealias completionWithItemsHandler:
typealias UIActivityViewControllerCompletionWithItemsHandler = (String?, Bool, [AnyObject]?, NSError?) -> Void
Remarque: le bloc de code précédent ne doit pas être utilisé dans votre projet, il indique simplement le type de fermeture nécessaire ( docs ).
Ce sont donc les paramètres qui sont passés dans le gestionnaire d'achèvement que vous souhaitez utiliser comme vous le souhaitez. Le gestionnaire d'achèvement se présentera ainsi:
avc.completionWithItemsHandler = { activity, success, items, error in
}
NOTE: Comme je n'ai pas lu la partie "Swift" de la question, j'ai répondu à la question dans Obj-C. Mon mauvais, Pour le PO: Je m'excuse
Voici une réponse plus complète qui peut être compilée. J'ai utilisé: dispatch_async
afin de faire une alerte afin que vous puissiez voir ce que "activityType" a fini par être.
avc.completionWithItemsHandler = ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) {
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertViewQuick(@"Activity Status", activityType, @"OK");
});
if (completed)
{
NSLog(@"The Activity: %@ was completed", activityType);
}
else
{
NSLog(@"The Activity: %@ was NOT completed", activityType);
}
};
Comme cette réponse dit, pour Swift 3 et 4 et iOS 10 et 11, utilisez-le comme ceci:
activityVC.completionWithItemsHandler = {(activityType: UIActivityType?, completed: Bool, returnedItems: [Any]?, error: Error?) in
}
present(activityVC, animated: true, completion: nil)
Cela a été répondu il y a un certain temps, mais contient un mélange d'informations manquantes et non swift. Voici donc ma version dans l'espoir que cela aidera quelqu'un ayant besoin d'un exemple plus complet du gestionnaire d'achèvement:
avc.completionWithItemsHandler = {[weak self](activityTypeChosen, completed:Bool, returnedItems:[AnyObject]?, error:NSError?) -> Void in
// ReturnedItems is an array of modified NSExtensionItem, or nil of nothing modified
// if (activityType == nil) User dismissed the view controller without making a selection.
// Dismiss the view controller we presented
// (assume a reference to it was stored in self.activityVC)
self?.activityVC?.dismissViewControllerAnimated(true, completion: {
if activityTypeChosen == nil {
NSLog("User canceled without choosing anything")
}
else if completed {
NSLog(")User chose an activity and iOS sent it to that other app/service/whatever OK")
}
else {
NSLog("There was an error: \(error)")
}
})
}
Notez la ligne où il ferme le contrôleur de vue. La documentation pour UIActivityViewController indique très explicitement que votre application est responsable de la présentation du VC et du le rejetant.