2014-12-13 55 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)