ios - UIActivityViewController UIActivityViewControllerCompletionWithItemsHandler
swift (4)
- Elemento de lista
Al usar Swift para una aplicación que se ejecuta en iOS 8, necesito escribir un controlador de finalización para el UIActivityViewController
para capturar los resultados del método de "compartir" que seleccionó un usuario.
Este es un fragmento del código que tengo hasta ahora. Mi pregunta es cómo configurar avc.completionWithItemsHandler
? Estoy seguro de que es simple, pero no lo veo.
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)
Como dice esta respuesta , para Swift 3 y 4 y para iOS 10 y 11, úselo así:
activityVC.completionWithItemsHandler = {(activityType: UIActivityType?, completed: Bool, returnedItems: [Any]?, error: Error?) in
}
present(activityVC, animated: true, completion: nil)
Esto fue respondido hace bastante tiempo, pero tiene una mezcla de información faltante y no rápida, así que aquí está mi versión con la esperanza de que ayude a alguien que necesite un ejemplo más completo del controlador de finalización:
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)")
}
})
}
Tenga en cuenta la línea donde se despide el controlador de vista. Los documentos de UIActivityViewController dicen muy explícitamente que su aplicación es responsable tanto de presentar el VC como de descartarlo.
Las tipografías de completar con artículos de Handler:
typealias UIActivityViewControllerCompletionWithItemsHandler = (String?, Bool, [AnyObject]?, NSError?) -> Void
Nota: el bloque de código anterior no se utilizará en su proyecto, solo muestra el tipo de cierre necesario ( docs ).
Así que esos son los parámetros que se pasan al controlador de finalización para que puedas hacer lo que quieras, para que el controlador de finalización se vea así:
avc.completionWithItemsHandler = { activity, success, items, error in
}
NOTA: Debido a que no leí la parte "SWIFT" de la pregunta, respondí la pregunta en Obj-C. Mi mal, a la OP: me disculpo
Aquí hay una respuesta más completa que realmente puede ser compilada . Utilicé: dispatch_async
para hacer una alerta y ver qué "tipo de actividad" terminó siendo.
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);
}
};