Подтвердить что ты не робот

UIActivityViewControllerCompletionHandler Как?

Я пытаюсь использовать UIActivityViewControllerCompletionHandler, но я не совсем понимаю, как..

Я хочу определить, когда пользователь завершит или отклонит этот контроллер просмотра (UIActivityViewController).

Кто-нибудь знает, как?

4b9b3361

Ответ 1

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

Второй параметр обработчика завершения указывает, отключен ли пользователь контроллером. Если они отклонили контроллер, completed будет установлен на NO.

Более подробная информация в документации обработчика завершения.

Ответ 2

Здесь показано, как вы показываете диалог совместного доступа и устанавливаете его обработчик завершения

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];

Ответ 3

С iOS 8 completionHandler устарела, поэтому вам нужно предоставить альтернативу completionWithItemsHandler. Он также позволяет обрабатывать добавленные измененные данные расширения (например, расширение фото). См. 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
        };
    }

Ответ 4

Свифт 5:

func showShareOf(url: URL, title: String) {
    let shareItems: [Any] = ["\(title)\n", url]
    let activityVC = UIActivityViewController(activityItems: shareItems, applicationActivities: nil)
    activityVC.completionWithItemsHandler = doneSharingHandler
    self.present(activityVC, animated: true, completion: nil)
}

@objc func doneSharingHandler(activityType: UIActivity.ActivityType?, completed: Bool, _ returnedItems: [Any]?, error: Error?) {
    if (!completed) { return }
    // If here, log which activity occurred
    print("Shared activity: \(activityType)")
}

Ответ 5

Для Swift это работает для меня...

    // 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)")
}