在下面的屏幕截图中,一些数据已通过AirDrop成功发送。 UIActivityViewController
更新为在收件人下方显示“已发送”,并且“取消”更改为“完成”。
在这种情况下,当前的视图控制器关闭UIActivityViewController
是否正确/良好做法/可行?
还是应该将该任务留给用户(和“完成”按钮)?
从UIActivityViewController
上的Apple文档中:
您的应用负责配置,展示和关闭该视图控制器。
如果在AirDrop案例中应该取消UIActivityViewController
,是否应将完成处理程序用于此目的?
@property(nonatomic, copy) UIActivityViewControllerCompletionWithItemsHandler completionWithItemsHandler
相关问题:
UIActivityViewController completion handler is !completed when using AirDrop
UIActivityViewController completionHandler how to check if activity send or not successfully?
最佳答案
在进一步考虑了文档以及使用内置活动(例如UIActivityTypeMail
)或第三方UIActivity
时的事件流之后,我认为以下...
1)AirDrop是一种特殊情况,因为用户的交互是在UIActivityViewController
本身内执行的。 UIActivityViewController
中的UI会相应更新,并且应用程序应保留对用户关闭UIActivityViewController
的权限(以及“取消/完成”按钮)。
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
被关闭(由用户)之后,我得到了log语句-不是在AirDrop操作完成(并显示“已发送”)之后。如果我使用内置活动(例如
UIActivityTypeMail
)或自定义第三方选项,则当用户完成操作时,这些操作(a)会显示其他UI,并且(b)会导致UIActivityViewController
被关闭用户界面。在这两种情况下,
UIActivityViewController
消失后我都会得到log语句。关于Accessing the Completion Handler的文档实际上非常清楚:
关闭活动视图控制器后要执行的完成处理程序。
@property(nonatomic, copy) UIActivityViewControllerCompletionWithItemsHandler completionWithItemsHandler
讨论区
当用户选择的服务完成对数据的操作时,或者当用户关闭视图控制器时,视图控制器将执行此完成处理程序,以使您的应用知道操作的最终结果。
我想如果这部分可能更清楚:
当用户选择的服务完成对数据的操作时...
指示用户选择的服务完成将导致视图控制器被解雇。
3)来自Apple关于UIActivityViewController的文档中的以下内容有些误导:
您的应用负责配置,展示和关闭该视图控制器。
关于ios - (在AirDrop之后)明确关闭UIActivityViewController是否正确/可行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31787477/