2012-09-23 1 views
23

Ich versuche, die UIActivityViewControllerCompletionHandler zu verwenden, aber ich habe nicht recht bekommen, wie ..UIActivityViewControllerCompletionHandler Wie?

ich, wenn der Benutzer beendet oder entlässt diese View-Controller (UIActivityViewController) erfassen möchten.

Wer weiß wie?

Antwort

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

Der zweite Parameter des Beendigungshandlers sagt Ihnen, ob der Benutzer den Controller entlassen hat. Wenn sie den Controller abgewiesen haben, wird completed auf NO gesetzt.

Es gibt weitere Details in the completion handler's documentation.

+1

Hey Kumpel, wie kann ich wissen, ob ich Post erfolgreich? Da selbst die Post in der Tat fehlgeschlagen ist, bleibt das "abgeschlossen" auch ja/1 - Paradise – Paradise

65

Hier ist, wie Sie eine Freigabe-Dialog zeigen, und setzen Sie den Abschluss-Handler

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

Hey Mann, woher weiß ich, ob ich Post erfolgreich habe? Da sogar der Post tatsächlich fehlgeschlagen ist, bleibt die "abgeschlossen" auch Ja/1 – Paradise

+1

Dieser Ansatz ist in iOS8 veraltet. – Praxiteles

19

Mit iOS 8 completionHandler ist veraltet, so dass Sie completionWithItemsHandler Alternative bieten wollen. Es erlaubt auch zu handhaben, wenn Erweiterung geänderte Daten, die Sie einstellen (sagen Sie Fotoverlängerung). Siehe 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

Für Swift, diese funktioniert für mich ...

 
    // 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

können Sie einen doneSharingHandler als Blockdeklaration hinzufügen? –