UIActivityViewController是什么?UIActivityViewControllerCompletionWithItemsHandler是做什么用的?

26
  • 列表项

    在运行iOS 8的应用程序中使用Swift,我需要为UIActivityViewController 编写完成处理程序以捕获用户选择的“共享”方法的结果。

    这是我到目前为止的代码片段。我的问题是如何设置avc.completionWithItemsHandler ? 我确定这很简单,但我没有看到它。

    <code>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)
    </code>
4个回答

41

completionWithItemsHandler的类型别名:

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

注意:前面的代码块不应在您的项目中使用,它只是显示所需闭包类型的示例(文档)。

因此,这些参数将传递给完成处理程序供您根据需要使用,因此完成处理程序将如下所示:

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

}

这段代码与你的完全相同,只是用Swift编写。第一个块是完成处理程序的类型别名,有些人知道闭包的参数,但实际上并不需要将其放入你的项目中。 - Ian
1
好的,好的,够了:) 认为我受到了惩罚。我的错。我没有看到“Swift”部分。(真的没有)。我会保留我的答案,但编辑它以表明我误解了问题。此外,我无法编辑我的投票,因为答案是“16小时前,除非答案被编辑,否则我无法编辑投票”(出于某种原因)。 - Jann
我编辑了我的帖子,以防止人们认为你将类型别名代码放入他们的项目中。 - Ian
+1 当我收到编译器警告“'completionHandler'在iOS 8.0中已被弃用:请改用completionWithItemsHandler。”时,这是一个有用的答案,因为它展示了我需要添加的Swift代码模板。 - dumbledad

13

注意:因为我没有读到问题中的“SWIFT”部分,所以我用Objective-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);
    }
};

你说的“实际上可以编译”是什么意思?这个问题涉及到Swift,而你用Objective-C写了一个答案。 - Mick MacCallum
4
好的,好的,够了 :) 认为我受到了惩戒。我的错。我没有看到“Swift”这部分。(真的没有)。我会留下我的答案,但编辑一下以表明我误解了问题。此外,我无法编辑我的投票,因为答案是“16小时前”,除非答案被编辑(由于某种原因)。 - Jann

3

正如这个回答所说,对于Swift 3和4以及iOS 10和11,请按照以下方式使用它:

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

}

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

1

这个问题已经有一段时间没有回答了,但是缺少了一些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和解除其显示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接