web-dev-qa-db-fra.com

UIActivityViewController UIActivityViewControllerCompletionWithItemsHandler

  • Élément de liste

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)
22
Custom_Software

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 

}
35
Ian

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);
    }
};
12
Jann

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)
1
Joel Márquez

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. 

0
Bill Patterson