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

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)
4b9b3361

Ответ 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)