R. *_*han 14 iphone objective-c ios uiactivityviewcontroller xcode9
我正在使用UIActivityViewController来共享文章网址,使用下面的代码,
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:shareItemArray applicationActivities:nil];
activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAirDrop];
[self presentViewController:activityVC animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)
上面的代码在iOS 9和10中工作,但它在iOS 11中不起作用
我调试它,代码执行正常,之后我在控制台中收到错误日志,如下所示
[ShareSheet]错误:等待建立与ShareUI视图服务扩展的连接超时.
有没有人面临这个问题?有解决方法吗?
编辑:清理并运行项目后,我尝试做同样的事情,在UIActivityViewController打开2或3次后,我再次尝试,第一次我得到相同的上述错误,第二次只有UIActivityViewController被打开.
所有修改用户界面的代码都需要在主队列中运行,这是设计的.所以你需要做的就是:
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:shareItemArray applicationActivities:nil];
activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAirDrop];
dispatch_async(dispatch_get_main_queue(), ^{
[self presentViewController:activityVC animated:YES completion:nil];
});
Run Code Online (Sandbox Code Playgroud)
稍微解释一下:dispatch_async()
如果可以安全地更新UI,则会将您传递给它的块排入不久的将来运行.如果你不在主队列上这样做,可能会发生奇怪的事情(有时候UI根本不会改变,或者旧的改变可以在新的改变之后应用,或类似的东西).
从UI中的用户操作发出消息的方法(例如,IBAction
当您点击按钮时)已经在主队列上运行,因此dispatch_async()
在那里没有必要(当然,假设您没有IBAction
从另一个队列手动调用它们) .
请注意alloc
/ init
并且setExcludedActivityTypes:
不更新UI,因此无需在主队列上调用它们.
对于swift 4.0
let activityViewController: UIActivityViewController = UIActivityViewController(activityItems: [shareItem], applicationActivities:nil)
activityViewController.excludedActivityTypes = [.print, .copyToPasteboard, .assignToContact, .saveToCameraRoll, .airDrop]
DispatchQueue.main.async {
self.present(activityViewController, animated: true, completion: nil);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5441 次 |
最近记录: |