2014-12-13 13 views
18
  • przedmiot

Korzystanie Swift dla aplikacji, która działa w iOS 8, muszę napisać obsługi zakończenie na UIActivityViewController uchwycić których wyniki „akcji” metody wybranej przez użytkownika.UIActivityViewController UIActivityViewControllerCompletionWithItemsHandler

To jest fragment kodu, który do tej pory miałem. Moje pytanie brzmi: jak ustawić avc.completionWithItemsHandler? Jestem pewien, że to proste, ale nie widzę tego.

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) 

Odpowiedz

30

W completionWithItemsHandler typealias:

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

UWAGA: poprzedni blok kodu nie jest do wykorzystania w projekcie, to tylko pokazuje rodzaj zamknięcia potrzebne (docs).

To są parametry, które są przekazywane do obsługi realizacji, aby zrobić z jak Ty, więc procedura obsługi ukończenie będzie wyglądać następująco:

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

} 
+0

To nie jest jeszcze ważny kod ... Spójrz na moją odpowiedź poniżej ... – Jann

+0

Jest dokładnie taki sam kod jak twój, ale w szybkim tempie. Pierwszy blok jest aliasem typu dla obsługi zakończenia, niektórzy znają parametry zamknięcia, a nie coś, co faktycznie umieściliście w projekcie. – Ian

+1

Okay, ok, wystarczy :) Uważaj mnie skarcenie. Mój błąd. Nie widziałem części "Swift". (naprawdę nie). Zostawię odpowiedź, ale zmienię ją, by powiedzieć, że źle zrozumiałem pytanie. Nie mogę też edytować mojego głosu Odpowiedź cos była "16 godzin temu i nie mogę edytować głosowania, chyba że odpowiedź jest edytowana" (z jakiegoś powodu) – Jann

10

UWAGA: Ponieważ nie przeczytałem część pytania "SWIFT", odpowiedziałem na pytanie w Obj-C. Mój zły, Do OP: przepraszam

Oto bardziej kompletna odpowiedź, która w rzeczywistości może być skompilowana . Użyłem: dispatch_async w celu wygenerowania alertu, aby zobaczyć, co "activityType" w końcu istniało.

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

Co masz na myśli "to, co faktycznie może być skompilowane"? To pytanie dotyczy Swift i napisałeś odpowiedź w Objective-C. –

+4

Okay, ok, wystarczy :) Uważaj mnie skarcenie. Mój błąd.Nie widziałem części "Swift". (naprawdę nie). Zostawię odpowiedź, ale zmienię ją, by powiedzieć, że źle zrozumiałem pytanie. Nie mogę też edytować mojego głosowania Odpowiedź cos była "16 godzin temu i nie mogę edytować głosowania, chyba że odpowiedź zostanie zmieniona" (z jakiegoś powodu) – Jann

0

Ten odpowiedział dość dawno temu, ale ma mieszankę brakuje i bez szybkiej informacji tak oto moja wersja w nadziei, że to pomoże ktoś potrzebuje bardziej kompletny przykład obsługi realizacji:

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

Zwróć uwagę na wiersz, w którym odrzuca kontroler widoku. Dokumenty dla UIActivityViewController mówią bardzo wyraźnie, że twoja aplikacja jest odpowiedzialna za przedstawienie VC i.

0

Jak this answer mówi dla Swift 3 i 4 oraz 10 i 11 iOS użytku to tak:

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

} 

present(activityVC, animated: true, completion: nil) 
Powiązane problemy