2012-09-23 32 views
23

estoy tratando de utilizar el UIActivityViewControllerCompletionHandler, pero yo no bastante conseguir la forma ..UIActivityViewControllerCompletionHandler ¿Cómo?

Quiero detectar cuando los acabados de usuario o desestima este controlador vista (UIActivityViewController).

¿Alguien sabe cómo?

Respuesta

18
typedef void (^UIActivityViewControllerCompletionHandler) 
    (NSString *activityType, BOOL completed); 

El segundo parámetro del controlador de finalización le indica si el usuario ha descartado el controlador. Si descartaron el controlador, completed se establecerá en NO.

Hay más detalles en the completion handler's documentation.

+1

Hey dude, ¿cómo puedo saber si tengo puesto con éxito? Debido a que incluso la publicación ha fallado, el "completado" sigue siendo también Sí/1 - Paradise – Paradise

65

Así es como usted muestra un cuadro de diálogo para compartir y configura su controlador de finalización

NSArray *imageArray = [NSArray arrayWithObject:shareImage]; 

UIActivityViewController *sharing = [[UIActivityViewController alloc] initWithActivityItems:imageArray applicationActivities:nil]; 

[sharing setCompletionHandler:^(NSString *activityType, BOOL completed) { 
    NSLog(@"completed dialog - activity: %@ - finished flag: %d", activityType, completed); 
}]; 

[self presentViewController:sharing animated:YES completion:nil]; 
+2

Hola amigo, ¿cómo puedo saber si tengo una publicación exitosa? Debido a que incluso la publicación ha fallado, el "completado" sigue siendo también Sí/1 – Paradise

+1

Este enfoque está en desuso en iOS8. – Praxiteles

19

Con iOS 8 completionHandler es obsoleta, por lo que tendrá que proporcionar alternativas completionWithItemsHandler. También permite manejar si la extensión modificó los datos que configuró (por ejemplo, extensión de foto). Ver Documentation

UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[text, URL, image] applicationActivities:nil]; 
    activityViewController.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeAirDrop, UIActivityTypeAddToReadingList]; 

    // check if new API supported 
    if ([activityViewController respondsToSelector:@selector(completionWithItemsHandler)]) { 
     activityViewController.completionWithItemsHandler = ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) { 
      // When completed flag is YES, user performed specific activity 
     }; 
    } else { 
     activityViewController.completionHandler = ^(NSString *activityType, BOOL completed) { 
      // When completed flag is YES, user performed specific activity 
     }; 
    } 
-1

Para Swift, éste funciona para mí ...

 
    // Configure UIActivityViewController 
    let activityViewController = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil) 
    activityViewController.excludedActivityTypes = [UIActivityTypeAirDrop, 
     UIActivityTypeAddToReadingList, 
     UIActivityTypeAssignToContact, 
     UIActivityTypePrint, 
     UIActivityTypeCopyToPasteboard] 

    // Show UIActivityViewController 
    presentViewController(activityViewController, animated: true, completion: nil) 

    // Define completion handler 
    activityViewController.completionWithItemsHandler = doneSharingHandler 

... 

func doneSharingHandler(activityType: String!, completed: Bool, returnedItems: [AnyObject]!, error: NSError!) { 

    // Return if cancelled 
    if (!completed) { 
     return 
    } 
    // If here, log which activity occurred 
    println("Shared video activity: \(activityType)") 
} 
+0

¿podría agregar un doneSharingHandler como una declaración de bloque? –

Cuestiones relacionadas