2014-12-13 61 views
18
  • 列表項

使用斯威夫特在iOS版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 2015-01-21 00:48:57

+0

正是與您的代碼相同,但速度很快。第一個塊是完成處理程序的類型別名,有些人知道閉包的參數,而不是實際放入項目的東西。 – Ian 2015-01-21 12:49:38

+1

好吧,好吧,足夠:)考慮我的懲罰。我的錯。我沒有看到「Swift」部分。 (我真的沒有)。我會留下我的答案,但編輯它說我誤解了問題。此外,我不能編輯我的投票回答是「16小時前,我不能編輯投票,除非回答編輯」(出於某種原因) – Jann 2015-01-21 17:01:56

10

注:因爲我沒看過問題的「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); 
} 

}; 
+0

你是什麼意思「實際上可以編譯」?這個問題是關於Swift的,你在Objective-C中寫了一個答案。 – 2015-01-21 12:54:44

+4

好吧,好吧,足夠:)考慮我的懲罰。我的錯。我沒有看到「Swift」部分。 (我真的沒有)。我會留下我的答案,但編輯它說我誤解了問題。此外,我不能編輯我的投票因爲答案是「16小時前,我不能編輯投票,除非答案被編輯」(出於某種原因) – Jann 2015-01-21 17:05:45

0

這前一段有人接聽,但缺少與非SWIFT信息所以這裏是我的希望,這將幫助別人需要完成處理的更完整的例子版本的混合:

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說,對於斯威夫特3和第4和iOS 10和11這樣使用它:

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

} 

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