2014-12-13 3 views
18
  • пункт Список

Использование Swift для приложения, которое работает в прошивкой 8, мне нужно написать обработчик завершения для UIActivityViewController, чтобы захватить результаты которых «доля» метода, выбранного пользователем.UIActivityViewController UIActivityViewControllerCompletionWithItemsHandler

Это фрагмент кода, который у меня есть до сих пор. Мой вопрос: как установить 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) 

ответ

30

В completionWithItemsHandler typealias:

typealias UIActivityViewControllerCompletionWithItemsHandler = (String?, Bool, [AnyObject]?, NSError?) -> Void 

Примечание: предыдущий кодовый блок не будет использоваться в проекте, он просто показывает тип закрытия необходимости (docs).

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

avc.completionWithItemsHandler = { activity, success, items, error in 

} 
+0

Это даже не правильный код ... Посмотрите на мой ответ ниже ... – Jann

+0

Это точно тот же код, что и у вас, но быстро. И первым блоком является псевдоним типа для обработчика завершения, некоторые люди знают параметры закрытия, а не то, что вы действительно вложили в свой проект. – Ian

+1

Хорошо, ладно, хватит :) Считай меня наказанным. Виноват. Я не видел «Swift». (я действительно этого не делал). Я оставлю свой ответ, но отредактирую его, чтобы сказать, что я неправильно понял вопрос. Также я не могу отредактировать свой голос, потому что ответ был «16 часов назад, и я не могу редактировать голосование, если не отредактирован ответ» (по какой-то причине) – Jann

10

ПРИМЕЧАНИЕ: Потому что я не читал «SWIFT» часть вопроса, я ответил на вопрос в Obj-C. Мой плохой, К ОП: я извиняюсь

Вот более полный ответ, который можно скомпилировать . Я использовал: 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); 
} 

}; 
+0

Что значит «что на самом деле можно скомпилировать»? Этот вопрос касается Swift, и вы написали ответ в Objective-C. –

+4

Хорошо, ладно, хватит :) Считай меня наказанным. Виноват.Я не видел «Swift». (я действительно этого не делал). Я оставлю свой ответ, но отредактирую его, чтобы сказать, что я неправильно понял вопрос. Также я не могу отредактировать свой голос, потому что ответ был «16 часов назад, и я не могу редактировать голосование, если не отредактирован ответ» (по какой-то причине) – Jann

0

Это ответили довольно давно, но есть соединение отсутствует и не быстрой информации, так вот моя версия в надежде, что это поможет кому-то нуждаясь более полный пример обработчика завершения:

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 и, отклонив их.

0

Как this answer говорит, для Swift 3 и 4 и прошивкой 10 и 11 использовать его как это:

activityVC.completionWithItemsHandler = {(activityType: UIActivityType?, completed: Bool, returnedItems: [Any]?, error: Error?) in 

} 

present(activityVC, animated: true, completion: nil) 
Смежные вопросы