2014-12-13 4 views
18
  • voce dell'Elenco

Utilizzando Swift per un app che gira in iOS 8, ho bisogno di scrivere un gestore di completamento per la UIActivityViewController per catturare i cui risultati metodo di "condividere" un utente selezionato.UIActivityViewController UIActivityViewControllerCompletionWithItemsHandler

Questo è uno snippet del codice che ho finora. La mia domanda è come impostare il avc.completionWithItemsHandler? Sono sicuro che sia semplice, ma non lo vedo.

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) 

risposta

30

I typealias completionWithItemsHandler:

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

Nota: il blocco di codice precedente non deve essere utilizzato nel progetto, solo mostra il tipo di chiusura necessario (docs).

Quindi questi sono i parametri che vengono passati al gestore di completamento per voi di fare con come si vuole, in modo che il gestore di completamento sarebbe simile a questa:

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

} 
+0

Questo non è nemmeno codice valido ... un'occhiata alla mia risposta qui sotto ... – Jann

+0

è esattamente lo stesso codice del tuo ma in modo rapido. E il primo blocco è l'alias di tipo per il gestore di completamento, alcune persone conoscono i parametri della chiusura, non qualcosa che hai effettivamente inserito nel tuo progetto. – Ian

+1

Ok, okay, basta :) Considerami punito. Colpa mia. Non ho visto la parte "Swift". (davvero non l'ho fatto). Lascerò la mia risposta ma la modificherò per dire che ho capito male la domanda. Inoltre non posso modificare il mio voto perché la risposta è stata "16 ore fa e non posso modificare il voto a meno che la risposta non sia modificata" (per qualche motivo) – Jann

10

NOTA: Perché non ho letto la parte "SWIFT" della domanda, ho risposto alla domanda in Obj-C. Il mio male, per l'OP: mi scuso

Ecco una risposta più completa che può essere compilata in realtà . Ho usato: dispatch_async per fare un avviso in modo da poter vedere cosa significa "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

Cosa intendi per "che può essere effettivamente compilato"? Questa domanda riguarda Swift e tu hai scritto una risposta in Objective-C. –

+4

Ok, okay, basta :) Considerami punito. Colpa mia.Non ho visto la parte "Swift". (davvero non l'ho fatto). Lascerò la mia risposta ma la modificherò per dire che ho capito male la domanda. Inoltre, non posso modificare il mio voto, la risposta è stata "16 ore fa e non posso modificare il voto a meno che la risposta non venga modificata" (per qualche motivo) – Jann

0

Questo è stato risposto un po 'di tempo fa, ma ha un mix di informazioni non-swift mancanti e quindi ecco la mia versione, nella speranza che possa aiutare qualcuno che necessitano di un esempio più completo del gestore di completamento:

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

Prendere nota della riga in cui viene chiuso il controller della vista. I documenti per UIActivityViewController dicono in modo molto esplicito che la tua app è responsabile sia della presentazione del VC che dello congedandolo.

0

Come this answer dice, per Swift 3 e 4 e iOS 10 e 11 usare in questo modo:

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

} 

present(activityVC, animated: true, completion: nil)