UIActivityViewControllerCompletionHandler Как?
Я пытаюсь использовать UIActivityViewControllerCompletionHandler
, но я не совсем понимаю, как..
Я хочу определить, когда пользователь завершит или отклонит этот контроллер просмотра (UIActivityViewController
).
Кто-нибудь знает, как?
Ответы
Ответ 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)")
}