UIActivityViewController UIActivityViewControllerCompletionWithItemsHandler
С помощью Swift для приложения, работающего в iOS 8, мне нужно написать обработчик завершения для UIActivityViewController
, чтобы захватить результаты, из которых выбран метод "общего доступа".
Это фрагмент кода, который у меня есть до сих пор. Мой вопрос: как установить avc.completionWithItemsHandler
? Я уверен, что это просто, но я этого не вижу.
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)
Ответы
Ответ 1
Товарищество с завершениемWithItemsHandler:
typealias UIActivityViewControllerCompletionWithItemsHandler = (String?, Bool, [AnyObject]?, NSError?) -> Void
Примечание: предыдущий блок кода не должен использоваться в вашем проекте, он просто показывает необходимый тип закрытия (docs).
Итак, это те параметры, которые передаются в обработчик завершения для вас, как вы это сделаете, поэтому обработчик завершения будет выглядеть так:
avc.completionWithItemsHandler = { activity, success, items, error in
}
Ответ 2
ПРИМЕЧАНИЕ. Поскольку я не читал часть вопроса "SWIFT", я ответил на вопрос в Obj-C. Мой плохой, К OP: я прошу прощения
Вот более полный ответ, который можно скомпилировать. Я использовал: dispatch_async
для того, чтобы сделать оповещение, чтобы вы могли видеть, что именно запустило "activityType".
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);
}
};
Ответ 3
Об этом ответили довольно давно, но есть смесь отсутствующей и не быстрой информации, поэтому здесь моя версия в надежде, что она поможет кому-то, кому нужен более полный пример обработчика завершения:
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)")
}
})
}
Обратите внимание на строку, в которой он отклоняет контроллер вида. Документы для UIActivityViewController очень четко говорят о том, что ваше приложение несет ответственность за представление VC и его увольнение.
Ответ 4
Как этот ответ говорит, что для Swift 3 и 4 и iOS 10 и 11 используйте его следующим образом:
activityVC.completionWithItemsHandler = {(activityType: UIActivityType?, completed: Bool, returnedItems: [Any]?, error: Error?) in
}
present(activityVC, animated: true, completion: nil)