在进一步考虑文档以及使用内置活动(例如UIActivityTypeMail)或第 3 方UIActivity 时的事件流程后,我认为以下...
1) AirDrop 是一种特殊情况,因为用户的交互是在UIActivityViewController 本身内执行的。 UIActivityViewController 中的 UI 会相应更新,并且应用程序应将关闭 UIActivityViewController 留给用户(以及 Cancel / Done 按钮)。
2) 完成处理程序旨在在 UIActivityViewController 被解除后使用...
...而不是解雇UIActivityViewController。
为了进行实验,我添加了以下代码:
[controller setCompletionWithItemsHandler:^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) {
NSLog(@"completed: %@, \n%d, \n%@, \n%@,", activityType, completed, returnedItems, activityError);
}];
- 在 AirDrop 案例中,我在点击 Done 后收到日志语句,
UIActivityViewController 被关闭(由用户) - 而不是在 AirDrop 操作完成后(并且 “已发送” 显示)。
- 如果我使用内置活动(例如
UIActivityTypeMail)或自定义的第三方选项,这些操作 (a) 会显示额外的 UI 并且 (b) 会导致 UIActivityViewController 被关闭,当用户以该 UI 结束。
在这两种情况下,我都会在 UIActivityViewController 消失后得到日志语句。
关于Accessing the Completion Handler 的文档其实很清楚:
在活动视图控制器关闭后执行的完成处理程序。
@property(nonatomic, copy) UIActivityViewControllerCompletionWithItemsHandler completionWithItemsHandler
讨论
当用户选择的服务完成对数据的操作,或者当用户关闭视图控制器时,视图控制器会执行这个完成处理程序,让您的应用知道操作的最终结果。
我想如果这部分可能会更清楚:
当用户选择的服务完成对数据的操作时...
表示用户选择的服务完成将导致视图控制器的关闭。
3) 以下来自 Apple 在 UIActivityViewController 上的文档有点误导:
您的应用负责配置、呈现、和关闭此视图控制器。